This commit is contained in:
2026-03-23 02:43:35 +08:00
parent a27ee426db
commit a8f9882e54
18 changed files with 1368 additions and 418 deletions

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:flutter_animate/flutter_animate.dart';
import '../../core/theme/app_colors.dart';
/// 资产卡片组件 - 用于显示资产总览
class AssetCard extends StatelessWidget {
@@ -13,9 +13,9 @@ class AssetCard extends StatelessWidget {
final Gradient? gradient;
final VoidCallback? onTap;
// 默认渐变色
// 默认渐变色 - 使用品牌蓝
static const defaultGradient = LinearGradient(
colors: [Color(0xFF00D4AA), Color(0xFF00B894)],
colors: [Color(0xFF2563EB), Color(0xFF1D4ED8)],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
);

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import '../../core/constants/app_colors.dart';
/// 币种卡片组件 - 用于显示币种信息
class CoinCard extends StatelessWidget {
@@ -11,10 +12,6 @@ class CoinCard extends StatelessWidget {
final String? icon;
final VoidCallback? onTap;
// 颜色常量
static const upColor = Color(0xFF00C853);
static const downColor = Color(0xFFFF5252);
const CoinCard({
super.key,
required this.code,
@@ -78,13 +75,13 @@ class CoinCard extends StatelessWidget {
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
decoration: BoxDecoration(
color: isUp ? upColor.withOpacity(0.2) : downColor.withOpacity(0.2),
color: AppColors.getChangeBackgroundColor(isUp),
borderRadius: BorderRadius.circular(6),
),
child: Text(
change,
style: TextStyle(
color: isUp ? upColor : downColor,
color: AppColors.getChangeColor(isUp),
fontWeight: FontWeight.w600,
),
),

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:provider/provider.dart';
import '../../../core/constants/app_colors.dart';
import '../../../providers/asset_provider.dart';
import '../../shared/ui_constants.dart';
import '../orders/fund_orders_page.dart';

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:provider/provider.dart';
import '../../../core/constants/app_colors.dart';
import '../../../providers/asset_provider.dart';
import '../../../providers/auth_provider.dart';
import '../../shared/ui_constants.dart';

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:provider/provider.dart';
import '../../../core/constants/app_colors.dart';
import '../../../data/models/coin.dart';
import '../../../providers/market_provider.dart';
@@ -97,7 +98,7 @@ class _MarketPageState extends State<MarketPage> with AutomaticKeepAliveClientMi
return Container(
height: 44,
margin: const EdgeInsets.symmetric(horizontal: 16),
margin: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Row(
children: tabs.asMap().entries.map((entry) {
final index = entry.key;
@@ -192,7 +193,7 @@ class _MarketPageState extends State<MarketPage> with AutomaticKeepAliveClientMi
onRefresh: provider.refresh,
color: theme.colorScheme.primary,
child: ListView.builder(
padding: const EdgeInsets.symmetric(horizontal: 16),
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
itemCount: coins.length,
itemBuilder: (context, index) => _buildCoinItem(coins[index]),
),
@@ -201,8 +202,6 @@ class _MarketPageState extends State<MarketPage> with AutomaticKeepAliveClientMi
Widget _buildCoinItem(Coin coin) {
final theme = ShadTheme.of(context);
final upColor = const Color(0xFF00C853);
final downColor = const Color(0xFFFF5252);
return Padding(
padding: const EdgeInsets.only(bottom: 8),
@@ -245,13 +244,13 @@ class _MarketPageState extends State<MarketPage> with AutomaticKeepAliveClientMi
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
decoration: BoxDecoration(
color: coin.isUp ? upColor.withValues(alpha: 0.2) : downColor.withValues(alpha: 0.2),
color: AppColors.getChangeBackgroundColor(coin.isUp),
borderRadius: BorderRadius.circular(6),
),
child: Text(
coin.formattedChange,
style: TextStyle(
color: coin.isUp ? upColor : downColor,
color: AppColors.getChangeColor(coin.isUp),
fontWeight: FontWeight.w600,
),
),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:provider/provider.dart';
import '../../../core/constants/app_colors.dart';
import '../../../data/models/coin.dart';
import '../../../providers/market_provider.dart';
import '../../../providers/asset_provider.dart';

View File

@@ -1,25 +1,21 @@
import 'package:flutter/material.dart';
/// UI 常量整合导出
///
/// 统一导出所有设计 token方便使用
/// 使用方式: import 'ui/shared/ui_constants.dart';
/// 应用颜色常量
class AppColors {
AppColors._();
// 导出颜色系统
export '../../core/constants/app_colors.dart';
static const Color up = Color(0xFF00C853);
static const Color down = Color(0xFFFF5252);
static const Color deposit = Color(0xFF00C853);
static const Color withdraw = Color(0xFFFF9800);
static const Color trade = Color(0xFF2196F3);
static const List<Color> gradientColors = [
Color(0xFF00D4AA),
Color(0xFF00B894),
];
}
// 导出主题配置 (包含 AppTextStyles, AppSpacing, AppRadius, AppBreakpoints)
export '../../core/theme/app_theme.dart';
/// 表单验证器
///
/// 提供常用的表单验证方法
class Validators {
Validators._();
/// 金额验证
static String? amount(String? value) {
if (value == null || value.isEmpty) {
return '请输入金额';
@@ -31,6 +27,7 @@ class Validators {
return null;
}
/// 价格验证
static String? price(String? value) {
if (value == null || value.isEmpty) {
return '请输入价格';
@@ -42,6 +39,7 @@ class Validators {
return null;
}
/// 数量验证
static String? quantity(String? value) {
if (value == null || value.isEmpty) {
return '请输入数量';
@@ -53,10 +51,45 @@ class Validators {
return null;
}
/// 必填字段验证
static String? required(String? value, String fieldName) {
if (value == null || value.isEmpty) {
return '请输入$fieldName';
}
return null;
}
/// 用户名验证
static String? username(String? value) {
if (value == null || value.isEmpty) {
return '请输入用户名';
}
if (value.length < 3) {
return '用户名至少 3 个字符';
}
return null;
}
/// 密码验证
static String? password(String? value) {
if (value == null || value.isEmpty) {
return '请输入密码';
}
if (value.length < 6) {
return '密码至少 6 个字符';
}
return null;
}
/// 邮箱验证
static String? email(String? value) {
if (value == null || value.isEmpty) {
return '请输入邮箱';
}
final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
if (!emailRegex.hasMatch(value)) {
return '请输入有效的邮箱地址';
}
return null;
}
}