feat(client): main 接入可切换三主题(启动恢复持久化选择)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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<JiuApp> {
|
||||
// 路由 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<JiuApp> {
|
||||
@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 [
|
||||
|
||||
@@ -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 酒窖酒红
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user