GoRouter 的 RouteObserver 捕获 go/goNamed 转换

Rom*_*kov 7 routes observers dart flutter flutter-go-router

我一直在通过第三方集成(例如SentryNavigatorObserver,FirebaseAnalyticsObserver)来分析不同的导航观察者,以使默认情况下没有它的工具相同。但我注意到这些都没有真正捕获所有路线转换。当他们在相应的控制台中显示数据时我看到了它。是的,它适用于push/ ,但不会跟踪pop同一级别内的任何转换。go这很烦人。有人知道解决的方法吗?


例如,

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

/pageA从到 的过渡/pageB则不是。

kri*_*yaa 18

延伸Observer自NavigatorObserver


代码

 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');
  }
}
Run Code Online (Sandbox Code Playgroud)

  • “+1”谢谢,这些信息很难在文档中找到。通过此解决方案,您可以看到路由何时被推送/弹出/删除。我现在可以使用它来通过谷歌分析跟踪页面/路由视图,通过使用“route.settings.name”获取请求的路由的名称并将其作为自定义事件传递到我的谷歌分析小部件(例如“page_clicked”,params {“page_name”:route.settings.name} (3认同)

Rom*_*kov 11

发现问题了。一些根路线是使用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)),
    ),
  ),
Run Code Online (Sandbox Code Playgroud)