变更内容: - 删除 uni-app x 项目 (app/ 目录) - 新增 Flutter 项目 (flutter_monisuo/ 目录) - 新增部署脚本 (deploy/ 目录) Flutter 项目功能: - 用户登录/注册 - 首页资产概览 - 行情币种列表 - 交易买卖操作 - 资产账户管理 - 充值/提现/划转 - 深色主题 - JWT Token 认证 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
137 lines
3.8 KiB
Dart
137 lines
3.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../../../core/constants/app_colors.dart';
|
|
import '../home/home_page.dart';
|
|
import '../market/market_page.dart';
|
|
import '../trade/trade_page.dart';
|
|
import '../asset/asset_page.dart';
|
|
import '../mine/mine_page.dart';
|
|
|
|
/// 主页面(包含底部导航)
|
|
class MainPage extends StatefulWidget {
|
|
const MainPage({super.key});
|
|
|
|
@override
|
|
State<MainPage> createState() => _MainPageState();
|
|
}
|
|
|
|
class _MainPageState extends State<MainPage> {
|
|
int _currentIndex = 0;
|
|
|
|
final List<Widget> _pages = [
|
|
const HomePage(),
|
|
const MarketPage(),
|
|
const TradePage(),
|
|
const AssetPage(),
|
|
const MinePage(),
|
|
];
|
|
|
|
final List<_TabItem> _tabs = [
|
|
_TabItem('首页', Icons.home_outlined, Icons.home),
|
|
_TabItem('行情', Icons.show_chart_outlined, Icons.show_chart),
|
|
_TabItem('交易', Icons.swap_horiz_outlined, Icons.swap_horiz),
|
|
_TabItem('资产', Icons.account_balance_wallet_outlined, Icons.account_balance_wallet),
|
|
_TabItem('我的', Icons.person_outline, Icons.person),
|
|
];
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: IndexedStack(
|
|
index: _currentIndex,
|
|
children: _pages,
|
|
),
|
|
bottomNavigationBar: _buildBottomNav(),
|
|
);
|
|
}
|
|
|
|
Widget _buildBottomNav() {
|
|
return Container(
|
|
decoration: const BoxDecoration(
|
|
color: AppColors.cardBackground,
|
|
border: Border(top: BorderSide(color: AppColors.border)),
|
|
),
|
|
child: SafeArea(
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 8),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: _tabs.asMap().entries.map((entry) {
|
|
final index = entry.key;
|
|
final tab = entry.value;
|
|
final isSelected = index == _currentIndex;
|
|
|
|
return GestureDetector(
|
|
onTap: () => setState(() => _currentIndex = index),
|
|
behavior: HitTestBehavior.opaque,
|
|
child: Container(
|
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(
|
|
isSelected ? tab.selectedIcon : tab.icon,
|
|
color: isSelected ? AppColors.primary : AppColors.textSecondary,
|
|
size: 24,
|
|
),
|
|
const SizedBox(height: 4),
|
|
Text(
|
|
tab.label,
|
|
style: TextStyle(
|
|
fontSize: 12,
|
|
color: isSelected ? AppColors.primary : AppColors.textSecondary,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}).toList(),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _TabItem {
|
|
final String label;
|
|
final IconData icon;
|
|
final IconData selectedIcon;
|
|
|
|
_TabItem(this.label, this.icon, this.selectedIcon);
|
|
}
|
|
|
|
/// IndexedStack 用于保持页面状态
|
|
class IndexedStack extends StatefulWidget {
|
|
final int index;
|
|
final List<Widget> children;
|
|
|
|
const IndexedStack({
|
|
super.key,
|
|
required this.index,
|
|
required this.children,
|
|
});
|
|
|
|
@override
|
|
State<IndexedStack> createState() => _IndexedStackState();
|
|
}
|
|
|
|
class _IndexedStackState extends State<IndexedStack> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Stack(
|
|
children: widget.children.asMap().entries.map((entry) {
|
|
return Positioned.fill(
|
|
child: Offstage(
|
|
offstage: entry.key != widget.index,
|
|
child: TickerMode(
|
|
enabled: entry.key == widget.index,
|
|
child: entry.value,
|
|
),
|
|
),
|
|
);
|
|
}).toList(),
|
|
);
|
|
}
|
|
}
|