Flutter-如何避免两次推同一条路线



我的应用程序导航的结构:

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);

相关内容

  • 没有找到相关文章

最新更新