我的应用程序导航的结构:
CupertinoTabScaffold ->tabBuilder:TabPage-> tabBar: CupertinoTabBar
我的选项卡页面:
return MaterialApp(
navigatorKey: navKey,
home: child,
);
我在每个选项卡中都有单独的导航。通过单击底部选项卡,我可以回到开头。这是我的代码,现在正在工作:
key.currentState!.pushNamedAndRemoveUntil('/', ModalRoute.withName('/'));
对于每个选项卡,我都有自己的导航键。我把它传给每个TabPage。
但如果页面在根,我需要避免两次推送相同的路由。我试过这个代码,但它不起作用:
key.currentState!.pushNamedAndRemoveUntil("/",
(route) => route.isFirst && route.settings.name == "/" ? false : true);
如何避免两次推同一条路线?
Navigator.of(context).pushNamedAndRemoveUntil(
"newRouteName",
(route) => route.isCurrent && route.settings.name == "newRouteName"
? false
: true);
t将弹出当前路由,如果路由的名称是";newRouteName";然后推一个新的,否则什么都不会弹出。
编辑:最新的flutter提供ModalRoute.of(context(.settings.name以获取当前路线的名称。
如果您使用BottomNavigationBar,您只需在onTap()
上添加一个检查器即可查看是否要在同一页面上导航。要跟踪当前页面,您可以使用enum或像int这样的简单变量。CupertinoTabBar也有类似于BottomNavigationBar的onTap属性。
BottomNavigationBar(
items: <BottomNavigationBarItem>[...],
currentIndex: _currentPage,
onTap: (value){
// Only navigate if a different page was clicked
if(value != _currentPage){
_currentPage = value;
setState(() {
switch(value) {
// Page 0
case 0:
key.currentState!.pushReplacementNamed(...);
break;
// Page 1
case 1:
key.currentState!.pushReplacementNamed(...);
break;
...
}
});
}
}
)
或者,如果您将TabBar与TabBarView一起使用,则显示的页面可以由控制器管理,如本指南所示。
如果路由名称为新路由名称,则会弹出当前路由,然后推送新路由,否则不会弹出任何路由。
Navigator.of(context).pushNamedAndRemoveUntil(
"new",
(route) => route.isCurrent && ModalRoute.of(context).settings.name == "new"
? false
: true);