From b69b3acaaf00ec9de18daa87d5a3fd071cd67b71 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Wed, 24 Jun 2026 21:40:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(client):=20=E4=B8=89=E5=A5=97=20ThemeData?= =?UTF-8?q?=20=E6=9E=84=E5=BB=BA=EF=BC=88=E6=8C=82=20AppTokens=EF=BC=8CB?= =?UTF-8?q?=20=E4=B8=BA=20dark=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- client/lib/core/theme/themes.dart | 25 +++++++++++++++++++++++++ client/test/theme/themes_test.dart | 17 +++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 client/lib/core/theme/themes.dart create mode 100644 client/test/theme/themes_test.dart diff --git a/client/lib/core/theme/themes.dart b/client/lib/core/theme/themes.dart new file mode 100644 index 0000000..4fea1b3 --- /dev/null +++ b/client/lib/core/theme/themes.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'app_tokens.dart'; +import 'app_tokens.g.dart'; + +ThemeData buildTheme(String key) { + final t = appTokensOf(key); + final brightness = t.isDark ? Brightness.dark : Brightness.light; + final scheme = ColorScheme.fromSeed( + seedColor: t.primary, + brightness: brightness, + ).copyWith( + primary: t.primary, + onPrimary: t.onPrimary, + surface: t.surface, + error: t.danger, + ); + return ThemeData( + useMaterial3: true, + brightness: brightness, + colorScheme: scheme, + scaffoldBackgroundColor: t.bg, + fontFamily: null, // 系统中文字体;字号梯度后续在组件层接入 + extensions: >[t], + ); +} diff --git a/client/test/theme/themes_test.dart b/client/test/theme/themes_test.dart new file mode 100644 index 0000000..44cf42a --- /dev/null +++ b/client/test/theme/themes_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:jiu_client/core/theme/app_tokens.dart'; +import 'package:jiu_client/core/theme/themes.dart'; + +void main() { + test('buildTheme 挂载 AppTokens 且亮暗正确', () { + final a = buildTheme('a'); + expect(a.extension(), isNotNull); + expect(a.brightness, Brightness.light); + expect(a.extension()!.primary, const Color(0xFF2563AC)); + + final b = buildTheme('b'); + expect(b.brightness, Brightness.dark); + expect(b.scaffoldBackgroundColor, b.extension()!.bg); + }); +}