135 lines
3.9 KiB
Dart
135 lines
3.9 KiB
Dart
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/force_guide_checker.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<String> _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<MyApp> createState() => _MyAppState();
|
||
}
|
||
|
||
class _MyAppState extends State<MyApp> 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<ThemeController>();
|
||
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()},
|
||
);
|
||
});
|
||
}
|
||
}
|