Files
CloudHome-Ops/lib/widgets/app_bottom_nav.dart

108 lines
3.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../utils/i10n.dart';
import '../utils/responsive.dart';
/// 底部导航栏(配合 [StatefulShellRoute] 使用)。
///
/// 五个 tab:首页、设备、门店、管理、我的。
class AppBottomNav extends StatelessWidget {
const AppBottomNav({super.key, required this.shell});
/// go_router 的导航壳。
final StatefulNavigationShell shell;
@override
Widget build(BuildContext context) {
final t = AppLocalizations.of(context);
final railDestinations = <NavigationRailDestination>[
NavigationRailDestination(
icon: const Icon(Icons.home_outlined),
selectedIcon: const Icon(Icons.home),
label: Text(t.home),
),
NavigationRailDestination(
icon: const Icon(Icons.devices_outlined),
selectedIcon: const Icon(Icons.devices),
label: Text(t.devices),
),
NavigationRailDestination(
icon: const Icon(Icons.store_outlined),
selectedIcon: const Icon(Icons.store),
label: Text(t.stores),
),
NavigationRailDestination(
icon: const Icon(Icons.admin_panel_settings_outlined),
selectedIcon: const Icon(Icons.admin_panel_settings),
label: Text(t.admin),
),
NavigationRailDestination(
icon: const Icon(Icons.person_outline),
selectedIcon: const Icon(Icons.person),
label: Text(t.profile),
),
];
void onSelect(int index) => shell.goBranch(
index,
// 点击当前 tab 时回到该分支根路由。
initialLocation: index == shell.currentIndex,
);
// 横屏:改用左侧 NavigationRail,腾出底部 80dp 纵向空间。
if (context.responsive.isLandscape) {
return Scaffold(
body: Row(
children: [
NavigationRail(
selectedIndex: shell.currentIndex,
onDestinationSelected: onSelect,
labelType: NavigationRailLabelType.all,
destinations: railDestinations,
),
const VerticalDivider(width: 1, thickness: 1),
Expanded(child: shell),
],
),
);
}
return Scaffold(
body: shell,
bottomNavigationBar: NavigationBar(
selectedIndex: shell.currentIndex,
onDestinationSelected: onSelect,
destinations: [
NavigationDestination(
icon: const Icon(Icons.home_outlined),
selectedIcon: const Icon(Icons.home),
label: t.home,
),
NavigationDestination(
icon: const Icon(Icons.devices_outlined),
selectedIcon: const Icon(Icons.devices),
label: t.devices,
),
NavigationDestination(
icon: const Icon(Icons.store_outlined),
selectedIcon: const Icon(Icons.store),
label: t.stores,
),
NavigationDestination(
icon: const Icon(Icons.admin_panel_settings_outlined),
selectedIcon: const Icon(Icons.admin_panel_settings),
label: t.admin,
),
NavigationDestination(
icon: const Icon(Icons.person_outline),
selectedIcon: const Icon(Icons.person),
label: t.profile,
),
],
),
);
}
}