rwadurian/frontend/mobile-app/lib/bootstrap.dart

99 lines
2.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}