Files
monisuo/flutter_monisuo/lib/ui/pages/main/main_page.dart
sion ffac6fc267 refactor: 将前端从 uni-app x 重构为 Flutter
变更内容:
- 删除 uni-app x 项目 (app/ 目录)
- 新增 Flutter 项目 (flutter_monisuo/ 目录)
- 新增部署脚本 (deploy/ 目录)

Flutter 项目功能:
- 用户登录/注册
- 首页资产概览
- 行情币种列表
- 交易买卖操作
- 资产账户管理
- 充值/提现/划转
- 深色主题
- JWT Token 认证

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 00:21:21 +08:00

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(),
);
}
}