我有三页,每一页都是
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。
如何知道页面是否在导航堆栈中打开并获取其索引号?
Navigator
的状态类包含一个名为List<Route<dynamic>> _history
的小部件列表。
由于该值被保留
private
并且没有提供公共getter
,因此我们无法找到在任何给定时刻推送的小部件的状态。
但是,
NavigatorState
确实提供了一些吸气剂来了解_history
的最末端的状态:
bool get isCurrent
// 如果当前小部件/路由位于堆栈顶部bool get isActive
// 如果当前小部件/路线位于导航器上bool get isFirst
// 如果当前小部件/路由位于堆栈底部由于它们都不接受任何小部件/路由作为参数,因此这些 getter 仅使用
this
为每个状态查询生成结果。我们无法获取有关堆栈中但在查询时尚未呈现的小部件的信息。
恐怕我找不到任何其他详细信息来了解更多有关其他路线的状态。
我已参考
navigator.dart
文件了解这些详细信息,因为大多数属性都是私有的,在线 API 文档没有帮助。
如果有人能提供更多细节,请告诉我。 :D
您可以使用扩展 Navigator Observer 的方法。 观察者将有方法检查页面是否在路由中。 在我的示例中,我使用 Get lib:
扩展导航器观察者:
类 YourRouteObserver 扩展 RouteObserver
@覆盖 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); } }
将观察者添加到您的应用程序中:
无效主(){ 最终routeObserver = YourRouteObserver();
运行应用程序( 获取材质应用程序( 获取页面:[ GetPage(名称: RouteName.yourPage, 页面: () => const YourPage()), ], navigatorObservers:[路线观察者], ), ); }
按名称打开页面:
onTap: () => Get.toNamed(RouteName.yourPage),
检查页面是否在堆栈中:
AppRouteObserver.containsRoute(RouteName.yourPage)