fix(ui): 修复主题切换功能,支持明暗主题动态切换
- 替换所有硬编码颜色为动态颜色 - 所有页面使用 Theme.of(context) 获取主题颜色 - 支持深色和浅色主题切换 - 修复 GlassPanel 和 NeonGlow 组件的主题适配 - 完善 lightMaterial ColorScheme 定义 - 测试主题切换功能正常 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -22,8 +22,10 @@ class AssetCard extends StatelessWidget {
|
||||
final VoidCallback? onTap;
|
||||
|
||||
/// 默认渐变色 - Neon Blue → Electric Purple
|
||||
static const defaultGradient = LinearGradient(
|
||||
colors: [AppColorScheme.darkPrimary, AppColorScheme.darkSecondary],
|
||||
static LinearGradient defaultGradientBuilder(bool isDark) => LinearGradient(
|
||||
colors: isDark
|
||||
? [AppColorScheme.darkPrimary, AppColorScheme.darkSecondary]
|
||||
: [AppColorScheme.lightPrimary, AppColorScheme.lightSecondary],
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
);
|
||||
@@ -50,7 +52,8 @@ class AssetCard extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = ShadTheme.of(context);
|
||||
final cardGradient = gradient ?? defaultGradient;
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final cardGradient = gradient ?? defaultGradientBuilder(isDark);
|
||||
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
|
||||
@@ -61,8 +61,12 @@ class GlassPanel extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final bgColor = backgroundColor ?? AppColorScheme.glassPanelBackground;
|
||||
final brColor = borderColor ?? AppColorScheme.glassPanelBorder;
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final bgColor = backgroundColor ??
|
||||
colorScheme.surfaceBright.withOpacity(isDark ? 0.4 : 0.6);
|
||||
final brColor = borderColor ??
|
||||
colorScheme.outlineVariant.withOpacity(0.15);
|
||||
final br = borderRadius ?? BorderRadius.circular(AppRadius.xl);
|
||||
|
||||
Widget content = ClipRRect(
|
||||
@@ -142,8 +146,11 @@ class GlassCard extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final br = borderRadius ?? BorderRadius.circular(AppRadius.xl);
|
||||
final glowColor = neonGlowColor ?? AppColorScheme.neonGlowPrimary;
|
||||
final glowColor = neonGlowColor ??
|
||||
colorScheme.primary.withOpacity(isDark ? 0.15 : 0.08);
|
||||
|
||||
Widget card = GlassPanel(
|
||||
padding: padding ?? EdgeInsets.all(AppSpacing.md),
|
||||
@@ -206,14 +213,17 @@ class GlassBottomSheet extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: AppColorScheme.glassPanelBackground,
|
||||
color: colorScheme.surfaceBright.withOpacity(isDark ? 0.4 : 0.6),
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(AppRadius.xxl),
|
||||
),
|
||||
border: Border.all(
|
||||
color: AppColorScheme.glassPanelBorder,
|
||||
color: colorScheme.outlineVariant.withOpacity(0.15),
|
||||
),
|
||||
),
|
||||
child: ClipRRect(
|
||||
@@ -231,7 +241,7 @@ class GlassBottomSheet extends StatelessWidget {
|
||||
width: 40,
|
||||
height: 4,
|
||||
decoration: BoxDecoration(
|
||||
color: AppColorScheme.darkOutlineVariant.withValues(alpha: 0.5),
|
||||
color: colorScheme.outlineVariant.withOpacity(0.5),
|
||||
borderRadius: BorderRadius.circular(2),
|
||||
),
|
||||
),
|
||||
@@ -250,10 +260,10 @@ class GlassBottomSheet extends StatelessWidget {
|
||||
Expanded(
|
||||
child: Text(
|
||||
title!,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: AppColorScheme.darkOnSurface,
|
||||
color: colorScheme.onSurface,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -263,14 +273,14 @@ class GlassBottomSheet extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(AppSpacing.sm),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColorScheme.darkOutlineVariant
|
||||
.withValues(alpha: 0.2),
|
||||
color: colorScheme.outlineVariant
|
||||
.withOpacity(0.2),
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: const Icon(
|
||||
child: Icon(
|
||||
Icons.close,
|
||||
size: 18,
|
||||
color: AppColorScheme.darkOnSurfaceVariant,
|
||||
color: colorScheme.onSurfaceVariant,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -91,7 +91,10 @@ class GradientButton extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final buttonGradient = gradient ?? AppColorScheme.darkCtaGradient;
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
final buttonGradient = gradient ??
|
||||
(isDark ? AppColorScheme.darkCtaGradient : AppColorScheme.lightCtaGradient);
|
||||
|
||||
return Container(
|
||||
width: isFullWidth ? double.infinity : null,
|
||||
|
||||
@@ -94,7 +94,7 @@ class NeonGlow extends StatelessWidget {
|
||||
}) {
|
||||
return NeonGlow(
|
||||
key: key,
|
||||
glowColor: AppColorScheme.darkError.withValues(alpha: 0.3),
|
||||
glowColor: AppColorScheme.down.withOpacity(0.3),
|
||||
blurRadius: blurRadius,
|
||||
borderRadius: borderRadius,
|
||||
child: child,
|
||||
@@ -205,65 +205,77 @@ class _NeonButtonState extends State<NeonButton>
|
||||
}
|
||||
|
||||
Color get _backgroundColor {
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
|
||||
switch (widget.type) {
|
||||
case NeonButtonType.primary:
|
||||
return AppColorScheme.darkPrimary;
|
||||
return colorScheme.primary;
|
||||
case NeonButtonType.secondary:
|
||||
return AppColorScheme.darkSecondary;
|
||||
return colorScheme.secondary;
|
||||
case NeonButtonType.tertiary:
|
||||
return AppColorScheme.darkTertiary;
|
||||
return AppColorScheme.up;
|
||||
case NeonButtonType.error:
|
||||
return AppColorScheme.darkError;
|
||||
return AppColorScheme.down;
|
||||
case NeonButtonType.outline:
|
||||
return Colors.transparent;
|
||||
}
|
||||
}
|
||||
|
||||
Color get _foregroundColor {
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
|
||||
switch (widget.type) {
|
||||
case NeonButtonType.primary:
|
||||
return AppColorScheme.darkOnPrimaryFixed;
|
||||
return isDark ? AppColorScheme.darkOnPrimary : const Color(0xFFFFFFFF);
|
||||
case NeonButtonType.secondary:
|
||||
return AppColorScheme.darkOnSecondary;
|
||||
return isDark ? AppColorScheme.darkOnSecondary : const Color(0xFFFFFFFF);
|
||||
case NeonButtonType.tertiary:
|
||||
return AppColorScheme.darkOnTertiaryFixed;
|
||||
return isDark ? AppColorScheme.darkOnTertiary : const Color(0xFFFFFFFF);
|
||||
case NeonButtonType.error:
|
||||
return AppColorScheme.darkOnError;
|
||||
return const Color(0xFFFFFFFF);
|
||||
case NeonButtonType.outline:
|
||||
return AppColorScheme.darkPrimary;
|
||||
return colorScheme.primary;
|
||||
}
|
||||
}
|
||||
|
||||
Color get _glowColor {
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
|
||||
switch (widget.type) {
|
||||
case NeonButtonType.primary:
|
||||
return AppColorScheme.neonGlowPrimary;
|
||||
return colorScheme.primary.withOpacity(isDark ? 0.15 : 0.08);
|
||||
case NeonButtonType.secondary:
|
||||
return AppColorScheme.neonGlowSecondary;
|
||||
return colorScheme.secondary.withOpacity(isDark ? 0.15 : 0.08);
|
||||
case NeonButtonType.tertiary:
|
||||
return AppColorScheme.neonGlowTertiary;
|
||||
return AppColorScheme.up.withOpacity(isDark ? 0.2 : 0.1);
|
||||
case NeonButtonType.error:
|
||||
return AppColorScheme.darkError.withValues(alpha: 0.3);
|
||||
return AppColorScheme.down.withOpacity(0.3);
|
||||
case NeonButtonType.outline:
|
||||
return AppColorScheme.neonGlowPrimary;
|
||||
return colorScheme.primary.withOpacity(isDark ? 0.15 : 0.08);
|
||||
}
|
||||
}
|
||||
|
||||
LinearGradient? get _gradient {
|
||||
if (widget.type == NeonButtonType.outline) return null;
|
||||
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
|
||||
switch (widget.type) {
|
||||
case NeonButtonType.primary:
|
||||
return const LinearGradient(
|
||||
colors: [AppColorScheme.darkPrimary, AppColorScheme.darkPrimaryContainer],
|
||||
begin: Alignment(-0.7, -0.7),
|
||||
end: Alignment(0.7, 0.7),
|
||||
return LinearGradient(
|
||||
colors: [colorScheme.primary, colorScheme.primaryContainer],
|
||||
begin: const Alignment(-0.7, -0.7),
|
||||
end: const Alignment(0.7, 0.7),
|
||||
);
|
||||
case NeonButtonType.secondary:
|
||||
return const LinearGradient(
|
||||
colors: [AppColorScheme.darkSecondary, AppColorScheme.darkSecondaryFixed],
|
||||
begin: Alignment(-0.7, -0.7),
|
||||
end: Alignment(0.7, 0.7),
|
||||
return LinearGradient(
|
||||
colors: [colorScheme.secondary, colorScheme.secondaryContainer ?? colorScheme.secondary],
|
||||
begin: const Alignment(-0.7, -0.7),
|
||||
end: const Alignment(0.7, 0.7),
|
||||
);
|
||||
case NeonButtonType.tertiary:
|
||||
return AppColorScheme.buyGradient;
|
||||
@@ -276,6 +288,9 @@ class _NeonButtonState extends State<NeonButton>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||
|
||||
final button = GestureDetector(
|
||||
onTapDown: widget.onPressed != null ? _onTapDown : null,
|
||||
onTapUp: widget.onPressed != null ? _onTapUp : null,
|
||||
@@ -292,7 +307,7 @@ class _NeonButtonState extends State<NeonButton>
|
||||
borderRadius: BorderRadius.circular(AppRadius.xxl),
|
||||
border: widget.type == NeonButtonType.outline
|
||||
? Border.all(
|
||||
color: AppColorScheme.darkOutlineVariant.withValues(alpha: 0.3),
|
||||
color: colorScheme.outlineVariant.withOpacity(0.3),
|
||||
)
|
||||
: null,
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user