Files
wushu/lib/main.dart
2026-04-10 06:22:06 +08:00

134 lines
3.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 '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<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()},
);
});
}
}