import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'core/storage/local_storage.dart'; import 'core/di/injection_container.dart'; import 'core/utils/logger.dart'; import 'core/updater/update_service.dart'; import 'core/updater/models/update_config.dart'; import 'core/telemetry/telemetry_service.dart'; /// API 基础地址(正式环境应该从配置读取) const String _apiBaseUrl = 'https://api.rwadurian.com'; Future bootstrap(FutureOr Function() builder) async { // Ensure Flutter bindings are initialized WidgetsFlutterBinding.ensureInitialized(); // Set preferred orientations await SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); // Set system UI overlay style SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: Brightness.dark, systemNavigationBarColor: Colors.white, systemNavigationBarIconBrightness: Brightness.dark, ), ); // Initialize Hive await Hive.initFlutter(); // Initialize LocalStorage final localStorage = await LocalStorage.init(); // Initialize UpdateService (自建服务器模式) UpdateService().initialize( UpdateConfig.selfHosted( apiBaseUrl: _apiBaseUrl, enabled: true, checkIntervalSeconds: 86400, // 24小时 ), ); // Create provider container with initialized dependencies final container = createProviderContainer(localStorage); // Run app with error handling FlutterError.onError = (details) { AppLogger.e('Flutter Error', details.exception, details.stack); // 上报错误到遥测服务 if (TelemetryService().isInitialized) { TelemetryService().logError( 'Flutter error', error: details.exception, stackTrace: details.stack, extra: {'context': details.context?.toString()}, ); } }; runApp( UncontrolledProviderScope( container: container, child: await builder(), ), ); } /// 初始化遥测服务(需要 BuildContext,在首屏加载后调用) Future initializeTelemetry(BuildContext context, {String? userId}) async { if (TelemetryService().isInitialized) return; await TelemetryService().initialize( apiBaseUrl: _apiBaseUrl, context: context, userId: userId, configSyncInterval: const Duration(hours: 1), ); } /// 检查应用更新 Future checkForAppUpdate(BuildContext context) async { if (!UpdateService().isInitialized) return; // 延迟几秒后检查更新,避免干扰用户 await Future.delayed(const Duration(seconds: 3)); if (!context.mounted) return; await UpdateService().checkForUpdate(context); }