如何知道页面是否打开/添加到导航器堆栈?

问题描述 投票:0回答:2

我有三页,每一页都是

StatefulWidget
放入单独的dart文件中,名为:

welcome.dart
page_01.dart
page_02.dart

我使用

pushNamed
Navigator
功能打开每个页面,如下所示:

Navigator.of(context).pushNamed('/pageName');

这是通过添加到我的应用程序主

RouteGenerator
小部件中的自定义
MaterialApp
实现的。

假设我按此顺序打开 welcome 页面,然后是 page_01 然后是 page_02。现在我正在查看位于导航堆栈顶部的page_02。我想知道 page_01 是否打开/添加到导航堆栈及其索引号,在本例中索引应为 1

如何知道页面是否在导航堆栈中打开并获取其索引号?

flutter dart flutter-layout
2个回答
12
投票

Navigator
的状态类包含一个名为
List<Route<dynamic>> _history
的小部件列表。

由于该值被保留

private
并且没有提供公共
getter
,因此我们无法找到在任何给定时刻推送的小部件的状态。

但是,

NavigatorState
确实提供了一些吸气剂来了解
_history
的最末端的状态:

  1. bool get isCurrent
    // 如果当前小部件/路由位于堆栈顶部
  2. bool get isActive
    // 如果当前小部件/路线位于导航器上
  3. bool get isFirst
    // 如果当前小部件/路由位于堆栈底部

由于它们都不接受任何小部件/路由作为参数,因此这些 getter 仅使用

this
为每个状态查询生成结果。我们无法获取有关堆栈中但在查询时尚未呈现的小部件的信息。

恐怕我找不到任何其他详细信息来了解更多有关其他路线的状态。

我已参考

navigator.dart
文件了解这些详细信息,因为大多数属性都是私有的,在线 API 文档没有帮助。

如果有人能提供更多细节,请告诉我。 :D


0
投票

您可以使用扩展 Navigator Observer 的方法。 观察者将有方法检查页面是否在路由中。 在我的示例中,我使用 Get lib:

  1. 扩展导航器观察者:

    类 YourRouteObserver 扩展 RouteObserver { 静态最终列表routeStack = [];

    @覆盖 void didPush(路线 路线, 路线? previousRoute) { 路由堆栈.add(路由); super.didPush(路由, previousRoute); }

    @覆盖 void didPop(路线 路线, 路线? previousRoute) { 路线堆栈.删除(路线); super.didPop(路由, previousRoute); }

    @覆盖 void didRemove(路线 路线, 路线? previousRoute) { 路线堆栈.删除(路线); super.didRemove(路线, previousRoute); }

    @覆盖 void didReplace({路线?新路线,路线?旧路线}) { 最终索引=routeStack.indexOf(oldRoute!); 如果(索引!= -1){ 路由堆栈[索引] = newRoute!; } 别的 { RouteStack.add(newRoute!); } super.didReplace(newRoute: newRoute, oldRoute: oldRoute); }

    静态 bool containsRoute(String 路由名称) { return RouteStack.any((route) => Route.settings.name == RouteName); } }

  2. 将观察者添加到您的应用程序中:

    无效主(){ 最终routeObserver = YourRouteObserver();

    运行应用程序( 获取材质应用程序( 获取页面:[ GetPage(名称: RouteName.yourPage, 页面: () => const YourPage()), ], navigatorObservers:[路线观察者], ), ); }

按名称打开页面:

onTap: () => Get.toNamed(RouteName.yourPage),
  1. 检查页面是否在堆栈中:

    AppRouteObserver.containsRoute(RouteName.yourPage)

© www.soinside.com 2019 - 2024. All rights reserved.