This commit is contained in:
sion
2026-04-07 01:05:05 +08:00
parent edad10ff06
commit 5ca1274607
83 changed files with 1561 additions and 1241 deletions

View File

@@ -3,10 +3,10 @@ import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
/// 金额输入框件(含超提示)
/// 金額輸入框件(含超提示)
///
/// 设计稿bg-tertiary角md高48。
/// 入金额超过可用 USDT 余额时显示警告提示。
/// 設計稿bg-tertiary角md高48。
/// 入金額超過可用 USDT 餘額時顯示警告提示。
class AmountInput extends StatefulWidget {
final TextEditingController amountController;
final String maxAmount;
@@ -63,7 +63,7 @@ class _AmountInputState extends State<AmountInput> {
Container(
height: 48,
decoration: BoxDecoration(
color: colorScheme.surfaceContainerHighest.withOpacity(0.5), // 整透明度
color: colorScheme.surfaceContainerHighest.withOpacity(0.5), // 調整透明度
borderRadius: BorderRadius.circular(AppRadius.md),
),
child: TextField(
@@ -74,7 +74,7 @@ class _AmountInputState extends State<AmountInput> {
fontWeight: FontWeight.w400,
),
decoration: InputDecoration(
hintText: '请输入金',
hintText: '請輸入金',
hintStyle: AppTextStyles.numberMedium(context).copyWith(
fontWeight: FontWeight.w400,
color: colorScheme.onSurfaceVariant.withOpacity(0.5),
@@ -94,7 +94,7 @@ class _AmountInputState extends State<AmountInput> {
Icon(Icons.error_outline, size: 13, color: warningColor),
SizedBox(width: AppSpacing.xs),
Text(
'超出可用USDT余额',
'超出可用USDT餘額',
style: AppTextStyles.bodySmall(context).copyWith(
color: warningColor,
),

View File

@@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
/// 币种头像组
/// 幣種頭像組
///
/// 显示币种图标或首字母的圆形头像,带主题色边框和背景。
/// 顯示幣種圖標或首字母的圓形頭像,帶主題色邊框和背景。
class CoinAvatar extends StatelessWidget {
final String? icon;
const CoinAvatar({super.key, this.icon});

View File

@@ -6,9 +6,9 @@ import '../../../../core/theme/app_theme_extension.dart';
import '../../../../data/models/coin.dart';
import 'coin_avatar.dart';
/// 币种选择器组
/// 幣種選擇器組
///
/// 显示当前选中的币种交易对,点击弹出底部弹窗选择币种
/// 顯示當前選中的幣種交易對,點擊彈出底部彈窗選擇幣種
class CoinSelector extends StatelessWidget {
final Coin? selectedCoin;
final List<Coin> coins;
@@ -38,7 +38,7 @@ class CoinSelector extends StatelessWidget {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// 币种信息:交易 + 名
// 幣種信息:交易 + 名
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
@@ -46,19 +46,19 @@ class CoinSelector extends StatelessWidget {
Text(
selectedCoin != null
? '${selectedCoin!.code}/USDT'
: '选择币种',
: '選擇幣種',
style: AppTextStyles.headlineLarge(context),
),
const SizedBox(height: 2),
Text(
selectedCoin?.name ?? '点击选择交易',
selectedCoin?.name ?? '點擊選擇交易',
style: AppTextStyles.bodyMedium(context).copyWith(
color: context.colors.onSurfaceVariant,
),
),
],
),
// 下拉箭
// 下拉箭
Icon(LucideIcons.chevronDown,
size: 16, color: context.colors.onSurfaceVariant),
],
@@ -83,7 +83,7 @@ class CoinSelector extends StatelessWidget {
),
child: Column(
children: [
// 拖指示器
// 拖指示器
Container(
margin: EdgeInsets.only(top: AppSpacing.sm),
width: 40,
@@ -93,13 +93,13 @@ class CoinSelector extends StatelessWidget {
borderRadius: BorderRadius.circular(AppRadius.sm),
),
),
// 标题栏
// 標題欄
Padding(
padding: EdgeInsets.all(AppSpacing.lg),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('选择币种',
Text('選擇幣種',
style: AppTextStyles.headlineLarge(context)),
GestureDetector(
onTap: () => Navigator.of(ctx).pop(),
@@ -110,7 +110,7 @@ class CoinSelector extends StatelessWidget {
),
),
Divider(height: 1, color: ctx.colors.outlineVariant.withValues(alpha: 0.2)),
// 币种列表
// 幣種列表
Expanded(
child: ListView.builder(
padding: EdgeInsets.symmetric(vertical: AppSpacing.sm),
@@ -150,7 +150,7 @@ class CoinSelector extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 第一行:币种代码 + USDT + 格 + 跌幅
// 第一行:幣種代碼 + USDT + 格 + 跌幅
Row(
children: [
Text(coin.code,
@@ -164,7 +164,7 @@ class CoinSelector extends StatelessWidget {
Text('\$${coin.formattedPrice}',
style: AppTextStyles.numberMedium(context)),
SizedBox(width: AppSpacing.sm),
// 跌幅徽章
// 跌幅徽章
Container(
padding: EdgeInsets.symmetric(horizontal: 6, vertical: 2),
decoration: BoxDecoration(
@@ -185,7 +185,7 @@ class CoinSelector extends StatelessWidget {
],
),
SizedBox(height: 3),
// 第二行:币种名称
// 第二行:幣種名稱
Text(coin.name,
style: AppTextStyles.bodyMedium(context).copyWith(
color: context.colors.onSurfaceVariant,

View File

@@ -5,10 +5,10 @@ import '../../../../core/theme/app_theme_extension.dart';
import '../../../components/glass_panel.dart';
import '../../../components/neon_glow.dart';
/// 交易确认对话
/// 交易確認對話
///
/// 示交易情(交易、委托价格、交易金、交易量),
/// 用户确认后执行交易。
/// 示交易情(交易、委託價格、交易金、交易量),
/// 用戶確認後執行交易。
class ConfirmDialog extends StatelessWidget {
final bool isBuy;
final String coinCode;
@@ -42,19 +42,19 @@ class ConfirmDialog extends StatelessWidget {
children: [
Center(
child: Text(
'确认${isBuy ? '' : ''}',
'確認${isBuy ? '' : ''}',
style: AppTextStyles.headlineLarge(context),
),
),
SizedBox(height: AppSpacing.lg),
_dialogRow(context, '交易', '$coinCode/USDT'),
_dialogRow(context, '交易', '$coinCode/USDT'),
SizedBox(height: AppSpacing.sm),
_dialogRow(context, '托价', '$price USDT'),
_dialogRow(context, '託價', '$price USDT'),
SizedBox(height: AppSpacing.sm),
_dialogRow(context, '交易金', '$amount USDT',
_dialogRow(context, '交易金', '$amount USDT',
valueColor: actionColor),
SizedBox(height: AppSpacing.sm),
_dialogRow(context, '交易', '$quantity $coinCode'),
_dialogRow(context, '交易', '$quantity $coinCode'),
SizedBox(height: AppSpacing.lg),
Row(
children: [
@@ -70,7 +70,7 @@ class ConfirmDialog extends StatelessWidget {
SizedBox(width: AppSpacing.sm),
Expanded(
child: NeonButton(
text: '确认${isBuy ? '' : ''}',
text: '確認${isBuy ? '' : ''}',
type: isBuy ? NeonButtonType.tertiary : NeonButtonType.error,
onPressed: () => Navigator.of(context).pop(true),
height: 44,

View File

@@ -3,9 +3,9 @@ import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_theme_extension.dart';
/// 位卡片
/// 位卡片
///
/// 当未选择币种时显示的位提示卡片。
/// 當未選擇幣種時顯示的位提示卡片。
class PlaceholderCard extends StatelessWidget {
final String message;
const PlaceholderCard({

View File

@@ -4,10 +4,10 @@ import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../data/models/coin.dart';
/// 格卡片
/// 格卡片
///
/// 显示当前币种价格和 24h 跌幅。
/// 局:大号价格(32px bold) + 跌幅徽章(角sm涨绿背景) + "24h 化" 副标题
/// 顯示當前幣種價格和 24h 跌幅。
/// 局:大號價格(32px bold) + 跌幅徽章(角sm漲綠背景) + "24h 化" 副標題
class PriceCard extends StatelessWidget {
final Coin coin;
const PriceCard({super.key, required this.coin});
@@ -34,7 +34,7 @@ class PriceCard extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 格行:大号价格 + 跌幅徽章
// 格行:大號價格 + 跌幅徽章
Row(
children: [
Text(
@@ -42,10 +42,10 @@ class PriceCard extends StatelessWidget {
style: AppTextStyles.numberLarge(context).copyWith(fontSize: 32),
),
const SizedBox(width: AppSpacing.sm),
// 跌幅徽章 - 角sm涨绿背景
// 跌幅徽章 - 角sm漲綠背景
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 4), // 整 padding
horizontal: 8, vertical: 4), // 調整 padding
decoration: BoxDecoration(
color: changeBgColor,
borderRadius: BorderRadius.circular(AppRadius.sm),
@@ -61,9 +61,9 @@ class PriceCard extends StatelessWidget {
],
),
const SizedBox(height: AppSpacing.sm),
// 副标题
// 副標題
Text(
'24h ',
'24h ',
style: AppTextStyles.bodySmall(context),
),
],

View File

@@ -3,9 +3,9 @@ import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
/// 交易按钮组
/// 交易按鈕組
///
/// CTA 入/出按。profit-green底 / sell-red底角lg高48入白字/卖出红字16px bold。
/// CTA 入/出按。profit-green底 / sell-red底角lg高48入白字/賣出紅字16px bold。
class TradeButton extends StatelessWidget {
final bool isBuy;
final String? coinCode;
@@ -27,7 +27,7 @@ class TradeButton extends StatelessWidget {
final colorScheme = Theme.of(context).colorScheme;
final fillColor =
isBuy ? AppColorScheme.buyButtonFill : AppColorScheme.sellButtonFill;
// 入按文字白色,出按文字为红
// 入按文字白色,出按文字為紅
final textColor = isBuy
? Colors.white
: (enabled ? AppColorScheme.sellButtonFill : colorScheme.onSurface.withOpacity(0.3));
@@ -52,7 +52,7 @@ class TradeButton extends StatelessWidget {
),
)
: Text(
'${isBuy ? '' : ''} ${coinCode ?? ""}',
'${isBuy ? '' : ''} ${coinCode ?? ""}',
style: AppTextStyles.headlineLarge(context).copyWith(
color: enabled
? textColor

View File

@@ -6,10 +6,10 @@ import '../../../../core/theme/app_theme_extension.dart';
import '../../../../data/models/coin.dart';
import 'amount_input.dart';
/// 交易表卡片
/// 交易表卡片
///
/// 包含入/出切、金额输入、可用余额、快捷比例按钮、计算数量行。
/// card背景 + 角lg + border + padding:20 + gap:16
/// 包含入/出切、金額輸入、可用餘額、快捷比例按鈕、計算數量行。
/// card背景 + 角lg + border + padding:20 + gap:16
class TradeFormCard extends StatelessWidget {
final int tradeType;
final Coin? selectedCoin;
@@ -43,7 +43,7 @@ class TradeFormCard extends StatelessWidget {
? context.appColors.up
: context.appColors.down;
// 设计稿中 card 背景色
// 設計稿中 card 背景色
final cardBgColor = context.appColors.surfaceCard;
return Container(
@@ -59,13 +59,13 @@ class TradeFormCard extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// ---- 入/出切 ----
// 设计稿ClipRRect + 角md两等宽按钮
// ---- 入/出切 ----
// 設計稿ClipRRect + 角md兩等寬按鈕
ClipRRect(
borderRadius: BorderRadius.circular(AppRadius.md),
child: Row(
children: [
// 入按
// 入按
Expanded(
child: GestureDetector(
onTap: () => onTradeTypeChanged(0),
@@ -84,7 +84,7 @@ class TradeFormCard extends StatelessWidget {
),
child: Center(
child: Text(
'',
'',
style: AppTextStyles.headlineMedium(context).copyWith(
color: isBuy
? Colors.white
@@ -95,7 +95,7 @@ class TradeFormCard extends StatelessWidget {
),
),
),
// 出按
// 出按
Expanded(
child: GestureDetector(
onTap: () => onTradeTypeChanged(1),
@@ -114,7 +114,7 @@ class TradeFormCard extends StatelessWidget {
),
child: Center(
child: Text(
'',
'',
style: AppTextStyles.headlineMedium(context).copyWith(
color: !isBuy
? Colors.white
@@ -130,11 +130,11 @@ class TradeFormCard extends StatelessWidget {
),
const SizedBox(height: AppSpacing.md + AppSpacing.sm),
// ---- 交易金 label 行 ----
// ---- 交易金 label 行 ----
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('交易金',
Text('交易金',
style: AppTextStyles.bodyMedium(context).copyWith(
color: context.colors.onSurfaceVariant,
)),
@@ -144,7 +144,7 @@ class TradeFormCard extends StatelessWidget {
),
const SizedBox(height: AppSpacing.sm),
// ---- 金额输入框 ----
// ---- 金額輸入框 ----
AmountInput(
amountController: amountController,
maxAmount: maxAmount,
@@ -154,7 +154,7 @@ class TradeFormCard extends StatelessWidget {
),
const SizedBox(height: AppSpacing.sm),
// ---- 可用余额 ----
// ---- 可用餘額 ----
Text(
isBuy
? '可用: $availableUsdt USDT'
@@ -165,8 +165,8 @@ class TradeFormCard extends StatelessWidget {
),
const SizedBox(height: AppSpacing.md),
// ---- 快捷比例按 25% 50% 75% 100% ----
// 设计稿gap:8角smbg-tertiary高32
// ---- 快捷比例按 25% 50% 75% 100% ----
// 設計稿gap:8角smbg-tertiary高32
Row(
children: [
_buildPctButton(context, '25%', 0.25),
@@ -180,11 +180,11 @@ class TradeFormCard extends StatelessWidget {
),
const SizedBox(height: AppSpacing.md + AppSpacing.sm),
// ---- 计算数量行 ----
// ---- 計算數量行 ----
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('交易',
Text('交易',
style: AppTextStyles.bodyMedium(context).copyWith(
color: context.colors.onSurfaceVariant,
)),
@@ -199,7 +199,7 @@ class TradeFormCard extends StatelessWidget {
);
}
/// 百分比按 - 设计稿:角smbg-tertiary高32
/// 百分比按 - 設計稿:角smbg-tertiary高32
Widget _buildPctButton(BuildContext context, String label, double pct) {
return Expanded(
child: GestureDetector(
@@ -207,7 +207,7 @@ class TradeFormCard extends StatelessWidget {
child: Container(
height: 32,
decoration: BoxDecoration(
color: context.colors.surfaceContainerHighest.withOpacity(0.5), // 更柔和的
color: context.colors.surfaceContainerHighest.withOpacity(0.5), // 更柔和的
borderRadius: BorderRadius.circular(AppRadius.sm),
),
child: Center(