diff --git a/client/lib/main.dart b/client/lib/main.dart index 09c4f66..8f5735d 100644 --- a/client/lib/main.dart +++ b/client/lib/main.dart @@ -10,7 +10,8 @@ import 'core/config/app_info.dart'; import 'core/errors/error_reporter.dart'; import 'core/platform/single_instance.dart' as single_instance; import 'core/router/app_router.dart'; -import 'core/theme/app_theme.dart'; +import 'core/theme/theme_controller.dart'; +import 'core/theme/themes.dart'; import 'providers/connectivity_provider.dart'; void main() { @@ -99,6 +100,7 @@ class _JiuAppState extends ConsumerState { // 路由 redirect 在 initialized=false 时返回 null(不重定向), // 初始化完成后 authState 变化触发 router refresh,redirect 重新执行 WidgetsBinding.instance.addPostFrameCallback((_) async { + await ref.read(themeControllerProvider.notifier).restore(); await ref.read(authStateProvider.notifier).restore(); await ref.read(connectivityProvider.notifier).forceCheck(); }); @@ -107,9 +109,10 @@ class _JiuAppState extends ConsumerState { @override Widget build(BuildContext context) { final router = ref.watch(appRouterProvider); + final themeKey = ref.watch(themeControllerProvider); return MaterialApp.router( title: kDebugMode ? '岩美 [DEBUG]' : '岩美', - theme: AppTheme.light(), + theme: buildTheme(themeKey), routerConfig: router, debugShowCheckedModeBanner: false, localizationsDelegates: const [ diff --git a/client/test/theme/theme_switch_widget_test.dart b/client/test/theme/theme_switch_widget_test.dart new file mode 100644 index 0000000..5f1ccfb --- /dev/null +++ b/client/test/theme/theme_switch_widget_test.dart @@ -0,0 +1,30 @@ +// client/test/theme/theme_switch_widget_test.dart +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:jiu_client/core/theme/context_tokens.dart'; +import 'package:jiu_client/core/theme/themes.dart'; +import 'package:jiu_client/core/theme/theme_controller.dart'; + +// 复刻 main.dart 的主题接线最小骨架,验证切 key → 主题色变化。 +void main() { + setUp(() => SharedPreferences.setMockInitialValues({})); + + testWidgets('切换 themeController 改变 context.tokens.primary', (tester) async { + late WidgetRef capturedRef; + late Color seen; + await tester.pumpWidget(ProviderScope(child: Consumer(builder: (ctx, ref, _) { + capturedRef = ref; + final key = ref.watch(themeControllerProvider); + return MaterialApp( + theme: buildTheme(key), + home: Builder(builder: (c) { seen = c.tokens.primary; return const SizedBox(); }), + ); + }))); + expect(seen, const Color(0xFF2563AC)); // a + await capturedRef.read(themeControllerProvider.notifier).set('c'); + await tester.pumpAndSettle(); + expect(seen, const Color(0xFF7C1F2C)); // c 酒窖酒红 + }); +}