import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'utils/app_theme.dart'; import 'utils/app_initializer.dart'; import 'utils/screen_adapter.dart'; import 'routes/app_routes.dart'; import 'constants/app_constants.dart'; import 'config/app_config.dart'; import 'controllers/shared_preferences_storage_controller.dart'; import 'services/get/theme_controller.dart'; import 'views/profile/guide/sp-guide.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); debugPrint('[启动] 开始初始化...'); try { await SharedPreferencesStorageController.init(); debugPrint('[启动] SharedPreferencesStorageController 初始化完成'); // 初始化 AppConfig,动态获取版本号 try { await AppConfig.init(); debugPrint('[启动] AppConfig 初始化完成'); } catch (e) { debugPrint('[启动] AppConfig 初始化异常: $e'); } // 初始化 ThemeController(在 AppInitializer 之前,确保主题最先加载) Get.put(ThemeController(), permanent: true); debugPrint('[启动] ThemeController 初始化完成'); // 检查是否需要显示引导页 String initialRoute = await _getInitialRoute(); debugPrint('[启动] 初始路由: $initialRoute'); runApp(MyApp(initialRoute: initialRoute)); debugPrint('[启动] 应用启动完成'); } catch (e) { debugPrint('[启动] 异常: $e'); runApp(MyApp(initialRoute: '/')); } } Future _getInitialRoute() async { final prefs = await SharedPreferences.getInstance(); bool agreementAccepted = prefs.getBool(AppConfig.keyAgreementAccepted) ?? false; // 如果协议未被接受,显示引导页 if (!agreementAccepted) { return '/sp-guide'; } // 否则使用 AppInitializer 返回的初始路由 try { final result = await AppInitializer.initialize(); return result.initialRoute; } catch (e) { debugPrint('[启动] AppInitializer.initialize 异常: $e'); return '/'; } } class MyApp extends StatefulWidget { final String initialRoute; const MyApp({super.key, required this.initialRoute}); @override State createState() => _MyAppState(); } class _MyAppState extends State with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeDependencies() { super.didChangeDependencies(); // 在第一帧绘制后再执行屏幕适配 WidgetsBinding.instance.addPostFrameCallback((_) { debugPrint('[启动] 执行屏幕适配...'); _setupScreenAdapter(); }); } void _setupScreenAdapter() { try { // 延迟调用屏幕适配,避免在启动时阻塞 Future.delayed(const Duration(milliseconds: 100), () { if (mounted) { ScreenAdapter.setPreferredOrientations(); ScreenAdapter.enableSystemUIOverlay(); ScreenAdapter.setSystemUIOverlayStyle( statusBarColor: Colors.transparent, ); debugPrint('[启动] 屏幕适配完成'); } }); } catch (e) { debugPrint('[启动] 屏幕适配异常: $e'); } } @override Widget build(BuildContext context) { // 使用 Obx 监听主题变化 return Obx(() { final themeController = Get.find(); return GetMaterialApp( title: AppConstants.appName, debugShowCheckedModeBanner: false, theme: AppTheme.lightTheme, darkTheme: AppTheme.darkTheme, themeMode: themeController.currentThemeMode, initialRoute: widget.initialRoute, onGenerateRoute: AppRoutes.generateRoute, routes: {'/sp-guide': (context) => const SpGuidePage()}, ); }); } }