我想做的是使用 go router 在我的 flutter 应用程序中实现底部导航栏。阅读了几篇文章后,我开始知道要实现持久的底部导航,我必须使用 go router 的 StatefulShellRoute。所以我实现了StatefulShellRoute。但使用此代码我没有得到预期的输出。
这是我的路由器类
class AppNavigation {
AppNavigation._();
static final _rootNavigatorKey = GlobalKey<NavigatorState>();
static final GlobalKey<NavigatorState> _homeTabNavigatorKey =
GlobalKey<NavigatorState>();
static final GlobalKey<NavigatorState> _settingsTabNavigatorKey =
GlobalKey<NavigatorState>();
static final GlobalKey<NavigatorState> _profileTabNavigatorKey =
GlobalKey<NavigatorState>();
static final router = GoRouter(
navigatorKey: _rootNavigatorKey,
initialLocation: "/home",
debugLogDiagnostics: true,
routes: [
GoRoute(
path: SplashScreen.routePath,
name: SplashScreen.routeName,
pageBuilder: (context, state) => getPage(
child: const SplashScreen(),
state: state,
),
),
StatefulShellRoute.indexedStack(
parentNavigatorKey: _rootNavigatorKey,
pageBuilder: (
BuildContext context,
GoRouterState state,
StatefulNavigationShell navigationShell,
) {
return getPage(
child: BottomNavigationScreen(
child: navigationShell,
),
state: state,
);
},
branches: [
StatefulShellBranch(
navigatorKey: _homeTabNavigatorKey,
routes: [
GoRoute(
path: "/home",
pageBuilder: (context, GoRouterState state) {
return getPage(
child: const HomeScreen(),
state: state,
);
},
),
],
),
StatefulShellBranch(
navigatorKey: _settingsTabNavigatorKey,
routes: [
GoRoute(
path: "/settings",
pageBuilder: (context, GoRouterState state) {
return getPage(
child: const SettingsScreen(),
state: state,
);
},
),
],
),
StatefulShellBranch(
navigatorKey: _profileTabNavigatorKey,
routes: [
GoRoute(
path: "/profile",
pageBuilder: (context, GoRouterState state) {
return getPage(
child: const ProfileScreen(),
state: state,
);
},
),
],
)
],
)
],
);
static Page getPage({
required Widget child,
required GoRouterState state,
}) {
return MaterialPage(
key: state.pageKey,
child: child,
);
}
}
这是我的底部导航屏幕
class BottomNavigationScreen extends StatefulWidget {
const BottomNavigationScreen({super.key, required this.child});
final StatefulNavigationShell child;
@override
State<BottomNavigationScreen> createState() => _BottomNavigationScreenState();
}
class _BottomNavigationScreenState extends State<BottomNavigationScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Bottom Navigator Shell'),
),
body: SafeArea(
child: widget.child,
),
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
currentIndex: widget.child.currentIndex,
onTap: (index) {
widget.child.goBranch(
index,
initialLocation: index == widget.child.currentIndex,
);
setState(() {});
},
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'Profile',
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
label: 'Settings',
),
],
),
);
}
}
预期输出:
输出:
我没有得到的是,当我使用设备后退按钮时,它正在关闭应用程序。但我想要实现的是,当我使用设备后退按钮时,它会返回到上一个选项卡。
您是否尝试过使用自定义实现来实现 PopScope?它将适用于这种情况。