get路由页面已通知有关自己的激活/停用时,更改当前导航器

问题描述 投票:0回答:1
时被激活或停用时通知它们的某些页面。当我的目标页面(

pagea

)和重叠页面(
pageB)属于同一Navigator 类触发
RouteObserver
Navigator
呼叫。 不幸的是,当Pagea
属于本地导航器时,此方法不起作用,而
PageB
是根导航器的一部分。如果
pageb出现在pagea
上,则两种导航器均未触发
RouteAware
didPushNext

回到

要使事情变得清晰,这是我路由器配置的简化版本: didPopNext 您可以看到,didPushNextdidPopNext

属于不同的导航器(分别由
final routerConfig = GoRouter( navigatorKey: _rootNavigatorKey, initialLocation: '/', observers: [rootRouteObserver], routes: [ GoRoute( path: '/', redirect: (context, state) => AppRoutes.splash(), ), StatefulShellRoute.indexedStack( builder: (BuildContext context, GoRouterState state, StatefulNavigationShell navigationShell) { return ScaffoldWithNavigationBar(navigationShell: navigationShell); }, branches: <StatefulShellBranch>[ StatefulShellBranch( navigatorKey: _miscNavigatorKey, observers: [miscRouteObserver], routes: <RouteBase>[ GoRoute( path: AppRoutes.misc(), builder: (context, state) => const MiscPage(), routes: <RouteBase>[ GoRoute( parentNavigatorKey: _rootNavigatorKey, path: AppRoutes._ordersRouteName, builder: (context, state) => const OrdersPage(), routes: <RouteBase>[ GoRoute( parentNavigatorKey: _rootNavigatorKey, path: '${AppRoutes._orderRouteName}/:orderId', builder: (context, state) => SingleOrderPage(orderId: state.pathParameters['orderId']), ), ], ), ], ), ], ), ], ), ], );
MiscPage标识)。 OrdersPage

显示在带有选项卡式导航的外壳路线内,表示一个选项卡的根页。

_miscNavigatorKey

出现在其上方,设计为全屏显示,重叠
_rootNavigatorKey
和Tab bar。 我的行为与

MiscPage

OrdersPage
的相同行为相同。
MiscPage
,在这里,我订阅了两个路线观察者,并期望在关闭后关闭
MiscPage
OrdersPage
-在关闭后再次激活
class AnyPageState extends State<AnyPage> with RouteAware { @override void initState() { WidgetsBinding.instance.addPostFrameCallback( (_) { rootRouteObserver.subscribe(this, ModalRoute.of(context)!); miscRouteObserver.subscribe(this, ModalRoute.of(context)!); } ); super.initState(); } @override void dispose() { rootRouteObserver.unsubscribe(this); miscRouteObserver.unsubscribe(this); super.dispose(); } @override void didPopNext() { doSomething(); } }
。 irl
didPopNext

仅用于

OrdersPage

 -imo,因为
SingleOrderPage
MiscPage

具有相同的(根)导航器。
OrdersPage

didPopNext

具有不同的导航器,因此从未要求首页要求
OrdersPage
回我的问题,在这种情况下,Gorouter,Navigator,Flutter等有其他方法可以完成工作吗?
	
我找不到任何内置的解决方案,因此必须提出自己的建议:
创建一个类,该类持有对路由器配置中使用的所有实例并介导订阅中的所有实例。它还包含匹配的信息,并符合订阅页的
OrdersPage
SingleOrderPage

update路由器配置,传递使用
MiscPage
创建的
OrdersPage
实例,并明确指定每个
didPopNext

RouteObserver

flutter flutter-navigation flutter-go-router
1个回答
0
投票
创建了通过通用

GoRoute

接口对任何
    Navigator
  1. 实例订阅的混合蛋白。从这一点开始,
    Route
    class _DummyRoute extends Route {}
    
    class _MultiRouteObserver {
      static final _dummyRoute = _DummyRoute();
      final _observers = <RouteObserver>{};
      final _routesMap = <RouteBase, Route>{};
    
      RouteObserver add([RouteObserver? observer]) {
        observer ??= RouteObserver();
        _observers.add(observer);
        return observer;
      }
    
      void subscribe(RouteAware routeAware, {required Route route, RouteBase? goRoute}) {
        if (goRoute != null) {
          _routesMap[goRoute] = route;
          final navigator = goRoute.parentNavigatorKey!.currentWidget as Navigator;
          RouteObserver? observer = navigator.observers.firstWhereOrNull(
            (element) => _observers.contains(element),
          ) as RouteObserver?;
          observer?.subscribe(routeAware, route);
        } else {
          for (RouteObserver observer in _observers) {
            observer.subscribe(routeAware, route);
          }
        }
      }
    
      void unsubscribe(RouteAware routeAware, {RouteBase? goRoute}) {
        if (goRoute != null) {
          _routesMap.remove(goRoute);
        }
        for (RouteObserver observer in _observers) {
          observer.unsubscribe(routeAware);
        }
      }
    
      void didPopNextFor(RouteBase goRoute) {
        for (RouteObserver observer in _observers) {
          observer.didPop(_dummyRoute, _routesMap[goRoute]);
        }
      }
    
      void didPushNextFor(RouteBase goRoute) {
        for (RouteObserver observer in _observers) {
          observer.didPush(_dummyRoute, _routesMap[goRoute]);
        }
      }
    }
    
    final appRouteObserver = _MultiRouteObserver();
    
    等都将用于包含此混音的任何页面。
    RouteObserver
    
    
  2. 将以下操作添加到
appRouteObserver.add()
(由于goroute的值以独特的方式获得,尚未应用
parentNavigatorKey
    混合蛋白)。实际上,该代码使
  1. GoRoute
    final routerConfig = GoRouter( navigatorKey: _rootNavigatorKey, initialLocation: '/', observers: [appRouteObserver.add()], routes: [ StatefulShellRoute.indexedStack( parentNavigatorKey: _rootNavigatorKey, builder: (BuildContext context, GoRouterState state, StatefulNavigationShell navigationShell) { return ScaffoldWithNavigationBar(navigationShell: navigationShell); }, branches: <StatefulShellBranch>[ StatefulShellBranch( navigatorKey: _catalogueNavigatorKey, observers: [appRouteObserver.add()], routes: <RouteBase>[ GoRoute( parentNavigatorKey: _catalogueNavigatorKey, path: AppRoutes.catalogue(), builder: (context, state) => const CataloguePage(), routes: <RouteBase>[ GoRoute( parentNavigatorKey: _catalogueNavigatorKey, path: '${AppRoutes._categoryRouteName}/:categoryId', builder: (context, state) => CategoryPage( categoryId: int.parse(state.pathParameters['categoryId'] ?? '0')), routes: <RouteBase>[ GoRoute( parentNavigatorKey: _rootNavigatorKey, path: '${AppRoutes._productRouteName}/:productId', builder: (context, state) => ProductPage( productId: int.parse(state.pathParameters['productId'] ?? '0')), ), ], ), ], ), ], ), StatefulShellBranch( navigatorKey: _miscNavigatorKey, observers: [appRouteObserver.add()], routes: <RouteBase>[ GoRoute( parentNavigatorKey: _miscNavigatorKey, path: AppRoutes.misc(), redirect: _loggedInOnly, builder: (context, state) => const MiscPage(), routes: <RouteBase>[ GoRoute( parentNavigatorKey: _rootNavigatorKey, path: AppRoutes._userProfileRouteName, builder: (context, state) => const UserProfilePage(), ), GoRoute( parentNavigatorKey: _rootNavigatorKey, path: AppRoutes._ordersRouteName, builder: (context, state) => const OrdersPage(), routes: <RouteBase>[ GoRoute( parentNavigatorKey: _rootNavigatorKey, path: '${AppRoutes._orderRouteName}/:orderId', builder: (context, state) => OrderPage(orderId: state.pathParameters['orderId']), ), ], ), ], ), ], ), ], ), ], );
    被要求在路由器的最上页面上要求,以防其他任何页面
    RouteObserver
        
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.