99 lines
2.9 KiB
Dart
99 lines
2.9 KiB
Dart
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<void> bootstrap(FutureOr<Widget> 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<void> 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<void> checkForAppUpdate(BuildContext context) async {
|
||
if (!UpdateService().isInitialized) return;
|
||
|
||
// 延迟几秒后检查更新,避免干扰用户
|
||
await Future.delayed(const Duration(seconds: 3));
|
||
|
||
if (!context.mounted) return;
|
||
|
||
await UpdateService().checkForUpdate(context);
|
||
}
|