refactor(theme): 迁移主题感知颜色至 ThemeExtension

- 创建 AppThemeColors ThemeExtension 类,统一管理主题感知颜色(涨跌色、卡片背景、渐变等)
- 从 AppColorScheme 移除主题感知辅助函数,仅保留静态颜色常量
- 在 AppTheme 中注册 ThemeExtension,支持深色/浅色主题工厂
- 重构所有 UI 组件使用 context.appColors 访问主题颜色,替代硬编码的 AppColorScheme 方法调用
- 移除组件中重复的 isDark 判断逻辑,简化颜色获取方式
- 保持向后兼容性,所有现有功能不变
This commit is contained in:
2026-04-06 01:58:08 +08:00
parent 396668aa43
commit 7ed2435a4c
36 changed files with 658 additions and 810 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../core/theme/app_spacing.dart';
/// 账户标签切换器 — .pen node UE6xC
@@ -19,14 +20,11 @@ class AccountTabSwitcher extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
return Container(
height: 40,
padding: const EdgeInsets.all(3),
decoration: BoxDecoration(
color: isDark ? colorScheme.surfaceContainerHighest : colorScheme.surfaceContainerHigh,
color: context.appColors.surfaceCardHigh,
borderRadius: BorderRadius.circular(AppRadius.md),
),
child: Row(
@@ -36,14 +34,12 @@ class AccountTabSwitcher extends StatelessWidget {
label: '资金账户',
isSelected: selectedIndex == 0,
onTap: () => onChanged(0),
isDark: isDark,
),
_buildTab(
context: context,
label: '交易账户',
isSelected: selectedIndex == 1,
onTap: () => onChanged(1),
isDark: isDark,
),
],
),
@@ -55,10 +51,7 @@ class AccountTabSwitcher extends StatelessWidget {
required String label,
required bool isSelected,
required VoidCallback onTap,
required bool isDark,
}) {
final colorScheme = Theme.of(context).colorScheme;
return Expanded(
child: GestureDetector(
onTap: onTap,
@@ -66,13 +59,13 @@ class AccountTabSwitcher extends StatelessWidget {
duration: const Duration(milliseconds: 200),
decoration: BoxDecoration(
color: isSelected
? colorScheme.surface
? context.colors.surface
: const Color(0x00000000),
borderRadius: BorderRadius.circular(AppRadius.sm),
boxShadow: isSelected
? [
BoxShadow(
color: colorScheme.shadow.withValues(alpha: 0.05),
color: context.colors.shadow.withValues(alpha: 0.05),
blurRadius: 3,
offset: const Offset(0, 1),
),
@@ -86,7 +79,7 @@ class AccountTabSwitcher extends StatelessWidget {
? AppTextStyles.headlineMedium(context)
: AppTextStyles.headlineMedium(context).copyWith(
fontWeight: FontWeight.w500,
color: colorScheme.onSurfaceVariant,
color: context.colors.onSurfaceVariant,
),
),
),

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_theme_extension.dart';
/// 操作按钮行 — .pen node pIpHe
/// gap: 12, three buttons evenly distributed
@@ -22,10 +23,8 @@ class ActionButtonsRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
final accentColor = isDark ? colorScheme.secondary : colorScheme.primary;
final bgColor = isDark ? colorScheme.surfaceContainerHighest : colorScheme.surfaceContainerHigh;
final accentColor = context.appColors.accentPrimary;
final bgColor = context.appColors.surfaceCardHigh;
return Row(
children: [

View File

@@ -4,6 +4,7 @@ import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:provider/provider.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/utils/toast_utils.dart';
@@ -246,7 +247,6 @@ void showDepositResultDialog(BuildContext context, Map<String, dynamic> data) {
final walletAddress = data['walletAddress'] as String? ?? '';
final walletNetwork = data['walletNetwork'] as String? ?? 'TRC20';
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
showShadDialog(
context: context,
@@ -263,7 +263,7 @@ void showDepositResultDialog(BuildContext context, Map<String, dynamic> data) {
children: [
NeonIcon(
icon: Icons.check_circle,
color: AppColorScheme.getUpColor(isDark),
color: context.appColors.up,
size: 24,
),
const SizedBox(width: AppSpacing.sm),
@@ -361,7 +361,6 @@ void showWithdrawDialog(BuildContext context, String? balance) {
final contactController = TextEditingController();
final formKey = GlobalKey<ShadFormState>();
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
showShadDialog(
context: context,
@@ -412,10 +411,10 @@ void showWithdrawDialog(BuildContext context, String? balance) {
vertical: AppSpacing.sm,
),
decoration: BoxDecoration(
color: AppColorScheme.getUpBackgroundColor(isDark),
color: context.appColors.upBackground,
borderRadius: BorderRadius.circular(AppRadius.full),
border: Border.all(
color: AppColorScheme.getUpColor(isDark).withValues(alpha: 0.2),
color: context.appColors.up.withValues(alpha: 0.2),
),
),
child: Row(
@@ -431,7 +430,7 @@ void showWithdrawDialog(BuildContext context, String? balance) {
'$balance USDT',
style: AppTextStyles.labelLarge(context).copyWith(
fontWeight: FontWeight.bold,
color: AppColorScheme.getUpColor(isDark),
color: context.appColors.up,
),
),
],

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../providers/asset_provider.dart';
import '../../../components/glass_panel.dart';
@@ -22,9 +22,6 @@ class BalanceCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
final displayBalance = activeTab == 0
? (provider.fundAccount?.balance ?? provider.overview?.fundBalance ?? '0.00')
: _calculateTradeTotal();
@@ -38,7 +35,7 @@ class BalanceCard extends StatelessWidget {
Text(
'USDT 余额',
style: AppTextStyles.bodyMedium(context).copyWith(
color: colorScheme.onSurfaceVariant,
color: context.colors.onSurfaceVariant,
fontWeight: FontWeight.w400,
),
),
@@ -51,7 +48,7 @@ class BalanceCard extends StatelessWidget {
Text(
'\u2248 \$${_formatBalance(displayBalance)} USD',
style: AppTextStyles.bodyMedium(context).copyWith(
color: isDark ? AppColorScheme.darkOnSurfaceMuted : colorScheme.onSurfaceVariant,
color: context.appColors.onSurfaceMuted,
fontWeight: FontWeight.w400,
),
),

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../data/models/account_models.dart';
import '../../../components/glass_panel.dart';
@@ -116,11 +116,9 @@ class HoldingRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
final accentColor = isDark ? colorScheme.secondary : colorScheme.primary;
final accentColor = context.appColors.accentPrimary;
final accentBgColor = accentColor.withValues(alpha: 0.1);
final profitColor = isProfit ? AppColorScheme.getUpColor(isDark) : AppColorScheme.getDownColor(isDark);
final profitColor = isProfit ? context.appColors.up : context.appColors.down;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: AppSpacing.md, vertical: 14),
@@ -159,7 +157,7 @@ class HoldingRow extends StatelessWidget {
quantity,
style: AppTextStyles.bodyMedium(context).copyWith(
fontWeight: FontWeight.w400,
color: colorScheme.onSurfaceVariant,
color: context.colors.onSurfaceVariant,
),
),
],

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../components/glass_panel.dart';
@@ -16,9 +16,7 @@ class RecordsLinkRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final isDark = Theme.of(context).brightness == Brightness.dark;
final mutedColor = isDark ? AppColorScheme.darkOnSurfaceMuted : colorScheme.onSurfaceVariant;
final mutedColor = context.appColors.onSurfaceMuted;
return GestureDetector(
onTap: onTap,