fix(ui): 修复主题切换功能,支持明暗主题动态切换

- 替换所有硬编码颜色为动态颜色
- 所有页面使用 Theme.of(context) 获取主题颜色
- 支持深色和浅色主题切换
- 修复 GlassPanel 和 NeonGlow 组件的主题适配
- 完善 lightMaterial ColorScheme 定义
- 测试主题切换功能正常

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 02:50:25 +08:00
parent 7bb426b3d8
commit a65aa0fa86
94 changed files with 17889 additions and 17478 deletions

View File

@@ -38,15 +38,16 @@ class _AssetPageState extends State<AssetPage> with AutomaticKeepAliveClientMixi
@override
Widget build(BuildContext context) {
super.build(context);
final colorScheme = Theme.of(context).colorScheme;
return Scaffold(
backgroundColor: AppColorScheme.darkBackground,
backgroundColor: colorScheme.background,
body: Consumer<AssetProvider>(
builder: (context, provider, _) {
return RefreshIndicator(
onRefresh: () => provider.refreshAll(force: true),
color: AppColorScheme.darkPrimary,
backgroundColor: AppColorScheme.darkSurfaceContainer,
color: colorScheme.primary,
backgroundColor: colorScheme.surfaceContainerHighest,
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
padding: AppSpacing.pagePadding,
@@ -81,6 +82,9 @@ class _AssetCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
return Container(
width: double.infinity,
padding: EdgeInsets.all(AppSpacing.lg + AppSpacing.sm),
@@ -89,7 +93,7 @@ class _AssetCard extends StatelessWidget {
borderRadius: BorderRadius.circular(AppRadius.xl),
boxShadow: [
BoxShadow(
color: AppColorScheme.neonGlowPrimary,
color: colorScheme.primary.withOpacity(isDark ? 0.15 : 0.08),
blurRadius: 20,
),
],
@@ -102,7 +106,7 @@ class _AssetCard extends StatelessWidget {
fontSize: 10,
fontWeight: FontWeight.w700,
letterSpacing: 0.2,
color: Colors.white.withValues(alpha: 0.7),
color: Colors.white.withOpacity(0.7),
),
),
SizedBox(height: AppSpacing.sm),
@@ -121,7 +125,7 @@ class _AssetCard extends StatelessWidget {
vertical: AppSpacing.xs + AppSpacing.xs,
),
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.1),
color: Colors.white.withOpacity(0.1),
borderRadius: BorderRadius.circular(AppRadius.full),
),
child: Row(
@@ -129,7 +133,7 @@ class _AssetCard extends StatelessWidget {
children: [
Icon(
LucideIcons.trendingUp,
color: Colors.white.withValues(alpha: 0.7),
color: Colors.white.withOpacity(0.7),
size: 14,
),
SizedBox(width: AppSpacing.xs),
@@ -137,7 +141,7 @@ class _AssetCard extends StatelessWidget {
'总盈亏: ${overview?.totalProfit ?? '0.00'} USDT',
style: TextStyle(
fontSize: 12,
color: Colors.white.withValues(alpha: 0.7),
color: Colors.white.withOpacity(0.7),
),
),
],
@@ -163,10 +167,13 @@ class _TabSelector extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
return Container(
padding: EdgeInsets.all(AppSpacing.xs),
decoration: BoxDecoration(
color: AppColorScheme.darkSurfaceContainer,
color: colorScheme.surfaceContainerHighest,
borderRadius: BorderRadius.circular(AppRadius.lg),
),
child: Row(
@@ -182,12 +189,12 @@ class _TabSelector extends StatelessWidget {
duration: const Duration(milliseconds: 200),
padding: EdgeInsets.symmetric(vertical: AppSpacing.sm + AppSpacing.xs),
decoration: BoxDecoration(
color: isSelected ? AppColorScheme.darkPrimary : Colors.transparent,
color: isSelected ? colorScheme.primary : Colors.transparent,
borderRadius: BorderRadius.circular(AppRadius.md),
boxShadow: isSelected
? [
BoxShadow(
color: AppColorScheme.neonGlowPrimary,
color: colorScheme.primary.withOpacity(isDark ? 0.15 : 0.08),
blurRadius: 10,
),
]
@@ -197,7 +204,7 @@ class _TabSelector extends StatelessWidget {
child: Text(
label,
style: TextStyle(
color: isSelected ? AppColorScheme.darkOnPrimaryFixed : AppColorScheme.darkOnSurfaceVariant,
color: isSelected ? colorScheme.onPrimary : colorScheme.onSurfaceVariant,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal,
),
),
@@ -220,6 +227,7 @@ class _FundAccountCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final fund = provider.fundAccount;
final colorScheme = Theme.of(context).colorScheme;
return GlassPanel(
padding: EdgeInsets.all(AppSpacing.lg + AppSpacing.xs),
@@ -233,7 +241,7 @@ class _FundAccountCard extends StatelessWidget {
'USDT 余额',
style: TextStyle(
fontSize: 12,
color: AppColorScheme.darkOnSurfaceVariant,
color: colorScheme.onSurfaceVariant,
),
),
GestureDetector(
@@ -246,14 +254,14 @@ class _FundAccountCard extends StatelessWidget {
Text(
'充提记录',
style: TextStyle(
color: AppColorScheme.darkPrimary,
color: colorScheme.primary,
fontSize: 12,
),
),
Icon(
LucideIcons.chevronRight,
size: 14,
color: AppColorScheme.darkPrimary,
color: colorScheme.primary,
),
],
),
@@ -266,7 +274,7 @@ class _FundAccountCard extends StatelessWidget {
style: GoogleFonts.spaceGrotesk(
fontSize: 28,
fontWeight: FontWeight.bold,
color: AppColorScheme.darkOnSurface,
color: colorScheme.onSurface,
),
),
SizedBox(height: AppSpacing.lg),
@@ -320,6 +328,8 @@ class _TradeAccountCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return GlassPanel(
padding: AppSpacing.cardPadding,
child: Column(
@@ -330,7 +340,7 @@ class _TradeAccountCard extends StatelessWidget {
style: GoogleFonts.spaceGrotesk(
fontSize: 16,
fontWeight: FontWeight.bold,
color: AppColorScheme.darkOnSurface,
color: colorScheme.onSurface,
),
),
SizedBox(height: AppSpacing.md),
@@ -363,6 +373,8 @@ class _EmptyState extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return Center(
child: Padding(
padding: EdgeInsets.all(AppSpacing.xl),
@@ -371,12 +383,12 @@ class _EmptyState extends StatelessWidget {
Icon(
icon,
size: 48,
color: AppColorScheme.darkOnSurfaceVariant,
color: colorScheme.onSurfaceVariant,
),
SizedBox(height: AppSpacing.sm + AppSpacing.xs),
Text(
message,
style: TextStyle(color: AppColorScheme.darkOnSurfaceVariant),
style: TextStyle(color: colorScheme.onSurfaceVariant),
),
],
),
@@ -393,6 +405,8 @@ class _HoldingItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return Padding(
padding: EdgeInsets.symmetric(vertical: AppSpacing.sm),
child: Row(
@@ -401,14 +415,14 @@ class _HoldingItem extends StatelessWidget {
width: 40,
height: 40,
decoration: BoxDecoration(
color: AppColorScheme.darkPrimary.withValues(alpha: 0.1),
color: colorScheme.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(AppRadius.md),
),
child: Center(
child: Text(
holding.coinCode.substring(0, 1),
style: TextStyle(
color: AppColorScheme.darkPrimary,
color: colorScheme.primary,
fontWeight: FontWeight.bold,
),
),
@@ -424,14 +438,14 @@ class _HoldingItem extends StatelessWidget {
style: GoogleFonts.spaceGrotesk(
fontSize: 14,
fontWeight: FontWeight.w600,
color: AppColorScheme.darkOnSurface,
color: colorScheme.onSurface,
),
),
Text(
'数量: ${holding.quantity}',
style: TextStyle(
fontSize: 12,
color: AppColorScheme.darkOnSurfaceVariant,
color: colorScheme.onSurfaceVariant,
),
),
],
@@ -444,7 +458,7 @@ class _HoldingItem extends StatelessWidget {
'${holding.currentValue} USDT',
style: TextStyle(
fontSize: 12,
color: AppColorScheme.darkOnSurface,
color: colorScheme.onSurface,
),
),
Text(