【问题标题】:RouteObserver for GoRouter to catch go/goNamed transitionsGoRouter 的 RouteObserver 捕捉 go/goNamed 转换
【发布时间】:2023-01-03 23:42:08
【问题描述】:
我一直在通过 3rd 方集成(例如,SentryNavigatorObserver、FirebaseAnalyticsObserver)分析不同的导航器观察器,以使默认情况下没有它的工具相同。但我注意到这些都没有真正捕获所有路由转换。当他们在相应的控制台中显示数据时,我看到了。是的,它适用于push/pop,但不会跟踪与go 处于同一级别的任何转换。这很烦人。任何人都知道解决它的方法吗?
例如,
观察到从/page 到/page/detail 的转变。
从/pageA 到/pageB 的过渡不是。
【问题讨论】:
标签:
flutter
routes
navigation
observers
flutter-go-router
【解决方案1】:
发现了问题。一些根路由是使用 pageBuilder 和 NoTransitionPage 构建的,以避免动画,因为它们作为选项卡工作。
但是除了设置NoTransitionPage.key初始化参数,你还需要设置NoTransitionPage.name来识别路由。
所以,因为我没有这样做,所以导航器将所有这些路线视为 null,所以它只是看不到它们之间的变化。
例如它应该如何:
GoRoute(
name: Routes.home,
path: Routes.getPathNamed(Routes.home),
pageBuilder: (context, state) => NoTransitionPage<void>(
key: state.pageKey, // <--- note this
name: state.name, // <--- note this
child: ScaffoldWithBottomBarNav(body: Routes.getPageNamed(Routes.home)),
),
),
【解决方案2】:
从NavigatorObserver扩展Observer
代码
GoRouter(
initialLocation: '/',
navigatorKey: _rootNavigatorKey,
observers: [
GoRouterObserver(), ? Specify your observer here
],
routes: [
GoRoute(
...
)
GoRoute(
...
),
],
);
class GoRouterObserver extends NavigatorObserver {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
print('MyTest didPush: $route');
}
@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
print('MyTest didPop: $route');
}
@override
void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {
print('MyTest didRemove: $route');
}
@override
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
print('MyTest didReplace: $newRoute');
}
}