pagea
)和重叠页面(pageB)属于同一
Navigator
类触发RouteObserver
和Navigator
呼叫。
不幸的是,当Pagea属于本地导航器时,此方法不起作用,而PageB
是根导航器的一部分。如果pageb出现在pagea
上,则两种导航器均未触发
RouteAware
或
didPushNext
回到
要使事情变得清晰,这是我路由器配置的简化版本:
didPopNext
您可以看到,didPushNext
和didPopNext
属于不同的导航器(分别由
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
GoRoute
Navigator
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
appRouteObserver.add()
(由于goroute的值以独特的方式获得,尚未应用
parentNavigatorKey
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