杂货 - 在更改当前导航器时,获取有关自己的激活/停用的通知路由页面 我需要在当前导航器变更后激活或停用时,需要通知我的某些应用程序页面。当我的目标页面(PAGEA)和重叠页面(Pageb)

问题描述 投票: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
混合蛋白)。实际上,该代码使
    GoRoute
  1. 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.