// 暖记 App 根组件 — MaterialApp + BLoC Provider 注入 // // 依赖注入结构: // MultiRepositoryProvider // ├─ ApiClient // ├─ AuthRepository // ├─ JournalRepository (RemoteJournalRepository) // └─ ClassRepository // └─ BlocProvider // └─ MaterialApp.router import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'core/theme/app_theme.dart'; import 'core/routing/app_router.dart'; import 'data/remote/api_client.dart'; import 'data/repositories/auth_repository.dart'; import 'data/repositories/journal_repository.dart'; import 'data/repositories/remote_journal_repository.dart'; import 'data/repositories/class_repository.dart'; import 'features/auth/bloc/auth_bloc.dart'; import 'features/profile/bloc/settings_bloc.dart'; /// 暖记 App — 根组件 class NuanjiApp extends StatelessWidget { const NuanjiApp({super.key}); @override Widget build(BuildContext context) { // 创建全局依赖(App 生命周期内单例) final apiClient = ApiClient(); final authRepository = AuthRepository(apiClient: apiClient); final journalRepository = RemoteJournalRepository(api: apiClient); final classRepository = ClassRepository(api: apiClient); final settingsBloc = SettingsBloc(); final authBloc = AuthBloc(authRepository: authRepository); // 启动时检查认证状态 authBloc.add(const AppStarted()); // 认证成功后注入 JWT token 到 ApiClient authBloc.stream.listen((state) { if (state is Authenticated) { // TODO: 从 SecureStorage 读取 token 并设置 // apiClient.setToken(token); } else { apiClient.clearToken(); } }); return MultiRepositoryProvider( providers: [ RepositoryProvider.value(value: apiClient), RepositoryProvider.value(value: authRepository), RepositoryProvider.value(value: journalRepository), RepositoryProvider.value(value: classRepository), RepositoryProvider.value(value: settingsBloc), ], child: BlocProvider.value( value: authBloc, child: ListenableBuilder( listenable: settingsBloc, builder: (context, _) => _AppView( router: createAppRouter(authBloc), themeMode: settingsBloc.state.themeMode, ), ), ), ); } } /// App 视图 — MaterialApp.router 包装 class _AppView extends StatelessWidget { final GoRouter router; final ThemeMode themeMode; const _AppView({required this.router, this.themeMode = ThemeMode.system}); @override Widget build(BuildContext context) { return MaterialApp.router( title: '暖记', debugShowCheckedModeBanner: false, theme: AppTheme.light(), darkTheme: AppTheme.dark(), themeMode: themeMode, routerConfig: router, ); } }