This commit is contained in:
sjk
2025-11-17 13:39:05 +08:00
commit d4cfe2b9de
479 changed files with 109324 additions and 0 deletions

127
client/lib/main.dart Normal file
View File

@@ -0,0 +1,127 @@
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'core/theme/app_theme.dart';
import 'core/routes/app_routes.dart';
import 'core/storage/storage_service.dart' as legacy_storage;
import 'core/services/storage_service.dart';
import 'core/services/navigation_service.dart';
import 'core/network/api_client.dart';
import 'core/providers/providers.dart';
import 'core/providers/app_state_provider.dart';
import 'core/config/environment.dart';
import 'shared/widgets/error_handler.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
FlutterError.onError = (FlutterErrorDetails details) {
debugPrint('FlutterError: ${details.exception}');
};
WidgetsBinding.instance.platformDispatcher.onError = (error, stack) {
debugPrint('ZoneError: $error');
return true;
};
// 使用runZonedGuarded包裹启动流程捕获所有未处理异常
runZonedGuarded(() async {
// 初始化环境配置
_initializeEnvironment();
// 初始化存储服务(两个都初始化以保持兼容性)
await legacy_storage.StorageService.init();
await StorageService.getInstance();
// 初始化API客户端
await ApiClient.getInstance();
// 创建Provider容器
final container = ProviderContainer(
observers: GlobalProviders.observers,
overrides: GlobalProviders.overrides,
);
// 预加载Provider
await GlobalProviders.preloadProviders(container);
runApp(
UncontrolledProviderScope(
container: container,
child: const MyApp(),
),
);
}, (error, stack) {
debugPrint('ZoneError: $error');
});
}
/// 初始化环境配置
void _initializeEnvironment() {
// 从编译时参数获取环境配置
const environment = String.fromEnvironment('ENVIRONMENT', defaultValue: 'development');
EnvironmentConfig.setEnvironmentFromString(environment);
// 检查是否有自定义API地址
const customApiUrl = String.fromEnvironment('API_BASE_URL');
debugPrint('========================================');
debugPrint('Environment: ${EnvironmentConfig.environmentName}');
debugPrint('API Base URL: ${EnvironmentConfig.baseUrl}');
if (customApiUrl.isNotEmpty) {
debugPrint('Custom API URL: $customApiUrl');
}
debugPrint('Debug Mode: ${EnvironmentConfig.debugMode}');
debugPrint('Enable Logging: ${EnvironmentConfig.enableLogging}');
debugPrint('========================================');
}
class MyApp extends ConsumerStatefulWidget {
const MyApp({super.key});
@override
ConsumerState<MyApp> createState() => _MyAppState();
}
class _MyAppState extends ConsumerState<MyApp> {
@override
void initState() {
super.initState();
// 确保应用启动后立即关闭全局加载状态
WidgetsBinding.instance.addPostFrameCallback((_) {
ref.read(appStateProvider.notifier).updateLoading(false);
});
}
@override
Widget build(BuildContext context) {
final appState = ref.watch(appStateProvider);
return GlobalErrorHandler(
child: MaterialApp(
title: 'AI English Learning',
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: appState.themeMode,
navigatorKey: NavigationService.instance.navigatorKey,
initialRoute: Routes.home,
onGenerateRoute: AppRoutes.onGenerateRoute,
builder: (context, child) {
return Stack(
children: [
child ?? const SizedBox.shrink(),
if (appState.isGlobalLoading)
const Positioned.fill(
child: Material(
color: Colors.black54,
child: Center(
child: CircularProgressIndicator(),
),
),
),
],
);
},
),
);
}
}