Flutter:如何避免在现有路由上推送相同的路由
Posted
技术标签:
【中文标题】Flutter:如何避免在现有路由上推送相同的路由【英文标题】:Flutter: How to avoid pushing the same route on existing route 【发布时间】:2019-06-21 22:55:59 【问题描述】:我有底部导航栏的视图,当您推送导航栏项目时,会推送一条新路线。
final navigatorKey = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) => MaterialApp(
home: Scaffold(
key: _scaffoldKey,
body: _buildBody(context),
bottomNavigationBar: _buildBottomNavigationBar(context),
),
);
void routeToView(routeIndex)
navigatorKey.currentState.pushNamed(pagesRouteFactories.keys.toList()[routeIndex]);
我想防止在当前视图上推送相同的路线。我想将当前路线与我们尝试推送的新路线进行比较,如果相同则忽略推送路线。
如果我们尝试推送的路线相同,我想将视图滚动到顶部
任何想法。
【问题讨论】:
【参考方案1】:NavigatorState 不公开用于获取路径的 API 当前路由,并且 Route 不公开用于确定路由的 API 路线的路径。路由可以(并且通常是)匿名的。你可以 找出给定的路线是否在导航器堆栈的顶部 现在使用 isCurrent 方法,但这不是很方便 你的用例。
https://***.com/a/46498543/2554745
这是我能想到的最接近的解决方案:
Navigator.of(context).pushNamedAndRemoveUntil(
"newRouteName",
(route) => route.isCurrent && route.settings.name == "newRouteName"
? false
: true);
如果路由名称为“newRouteName”,则弹出当前路由,然后推送新的,否则不会弹出任何内容。
编辑:最新的flutter提供ModalRoute.of(context).settings.name
获取当前路由的名称。
【讨论】:
这应该没问题,只是视图必须再次加载数据。我们也失去了滚动位置。我是否应该在单击导航按钮后禁用它,并且仅在用户选择另一个导航按钮时才启用? 每当您在变量中推送新路由时,都会存储 currentRouteName。并在推送前进行比较。那将是您的解决方案。 @HarshBhikadia 你能建议 pushAndRemoveUntil 的替代品吗? @HarshBhikadia 我明白你的意思。但是,假设我想推送类似 Navigator.push(context, MaterialPageRoute(builder: (context)=>TestScreen())); 的路线那么无论如何要检查当前的溃败是否等于 TestScreen() ?我无法弄清楚这个。 当您推送TestScreen
时使用Naivagtor.pushNamed
方法,传递您想要的名称。您可以获得编辑中提及的当前路线的名称(如果已设置)【参考方案2】:
这对我有用:
Route route = ModalRoute.of(context);
final routeName = route?.settings?.name;
if (routeName != null && routeName != nav)
Navigator.of(context).pushNamed(nav);
print(route.settings.name);
【讨论】:
以上是关于Flutter:如何避免在现有路由上推送相同的路由的主要内容,如果未能解决你的问题,请参考以下文章
使用 BLoC 的 Flutter 导航:用于从 Navigator 推送路由的上下文必须是 Navigator 小部件的后代