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:如何避免在现有路由上推送相同的路由的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中使用路由制作持久抽屉?

Flutter:如何在对话框中使用路由器

Flutter Web 中的路由有意外行为

使用 BLoC 的 Flutter 导航:用于从 Navigator 推送路由的上下文必须是 Navigator 小部件的后代

网页中的 Flutter GetX 路由

如何在推送路由颤动上创建淡入淡出过渡?