我一直在通过第三方集成(例如,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');
}
}
找到问题。有些根路由是使用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)),
),
),