| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import 'package:flutter/material.dart';
- import 'package:flutter_riverpod/flutter_riverpod.dart';
- import 'package:go_router/go_router.dart';
- import '../../../core/l10n/app_localizations.dart';
- import '../../../providers/asset_provider.dart'
- show assetProvider, currentAssetSubTabProvider;
- import '../../../providers/auth_provider.dart';
- import '../../../providers/copy_trading_provider.dart';
- import '../../../providers/futures_provider.dart'
- show activeBottomTabProvider;
- import '../../../providers/home_provider.dart';
- import '../../../providers/my_copy_trading_provider.dart';
- /// 需要登录才能进入的 tab 索引集合(5=资产)
- const _authRequiredTabs = {5};
- /// 底部导航壳 — 首页 / 行情 / 交易 / 合约 / 跟单 / 资产
- class BottomNavShell extends ConsumerWidget {
- const BottomNavShell({super.key, required this.navigationShell});
- final StatefulNavigationShell navigationShell;
- @override
- Widget build(BuildContext context, WidgetRef ref) {
- final l10n = AppLocalizations.of(context)!;
- return Scaffold(
- body: navigationShell,
- bottomNavigationBar: BottomNavigationBar(
- currentIndex: navigationShell.currentIndex,
- onTap: (index) {
- // 需要登录的 tab:未登录时跳转登录页
- if (_authRequiredTabs.contains(index)) {
- final isLoggedIn = ref.read(isLoggedInProvider);
- if (!isLoggedIn) {
- context.push('/login');
- return;
- }
- }
- ref.read(activeBottomTabProvider.notifier).state = index;
- // 交易 tab:始终回到现货
- if (index == 2) {
- context.go('/spot/BTCUSDT');
- } else {
- // 先切换 tab,刷新操作延迟到下一帧执行,避免阻塞切换动画
- navigationShell.goBranch(
- index,
- initialLocation: index == navigationShell.currentIndex,
- );
- }
- // 延迟执行数据刷新,不阻塞 tab 切换的首帧渲染
- Future.microtask(() {
- if (index == 0) {
- ref.read(homeProvider.notifier).refreshAsset();
- }
- if (index == 4) {
- ref.read(copyTradingProvider.notifier).refresh();
- }
- if (index == 5) {
- final subTab = ref.read(currentAssetSubTabProvider);
- ref.read(assetProvider.notifier).silentRefresh();
- if (subTab == 4) {
- ref.read(myCopyTradingProvider.notifier).silentRefresh();
- }
- }
- });
- },
- items: [
- BottomNavigationBarItem(
- icon: const Icon(Icons.home_outlined),
- activeIcon: const Icon(Icons.home),
- label: l10n.home,
- ),
- BottomNavigationBarItem(
- icon: const Icon(Icons.bar_chart_outlined),
- activeIcon: const Icon(Icons.bar_chart),
- label: l10n.market,
- ),
- BottomNavigationBarItem(
- icon: const Icon(Icons.swap_horiz_outlined),
- activeIcon: const Icon(Icons.swap_horiz),
- label: l10n.bottomNavTrade,
- ),
- BottomNavigationBarItem(
- icon: const Icon(Icons.layers_outlined),
- activeIcon: const Icon(Icons.layers),
- label: l10n.futures,
- ),
- BottomNavigationBarItem(
- icon: const Icon(Icons.people_alt_outlined),
- activeIcon: const Icon(Icons.people_alt),
- label: l10n.copyTrading,
- ),
- BottomNavigationBarItem(
- icon: const Icon(Icons.account_balance_wallet_outlined),
- activeIcon: const Icon(Icons.account_balance_wallet),
- label: l10n.assets,
- ),
- ],
- ),
- );
- }
- }
|