RouteObserver for GoRouter捕捉go/goNamed转换



我一直在通过第三方集成(例如,SentryNavigatorObserver,FirebaseAnalyticsObserver)分析不同的导航器观察器,以便为默认情况下没有它的工具制作相同的导航器。但我注意到,这两种方法都没有真正捕捉到所有的路线转换。当它们在相应的控制台中显示数据时,我看到了这一点。是的,它与push/pop一起工作,但与go在同一级别内的任何过渡都没有被跟踪。这很烦人。有人知道怎么解吗?

例如,

观察到/page/page/detail的转变。

/pageA/pageB的转换不是。

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');
}
}

找到问题。有些根路由是使用pageBuilderNoTransitionPage构建的,这样可以避免动画,因为它们是作为选项卡工作的。

但是除了设置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)),
),
),

相关内容

  • 没有找到相关文章

最新更新