flutter GoRouter的RouteObserver用于捕获go/goNamed转换

mitkmikd  于 2023-01-06  发布在  Flutter
关注(0)|答案(2)|浏览(207)

我一直在通过第三方集成分析不同的Navigator观察器(例如,SentryNavigatorObserverFirebaseAnalyticsObserver),以使默认情况下没有它的工具相同。但我注意到,这两个工具都不能真正捕捉所有的路由转换。我在它们相应的控制台中显示数据时看到它。是的,它适用于push/pop,但是与go在同一级别内的任何转换都没有被跟踪。这非常烦人。有人知道解决它的方法吗?
例如,
观察到了从/page/page/detail的跃迁。
/pageA/pageB的过渡不是。

xdyibdwo

xdyibdwo1#

发现问题。一些根路由是使用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)),
    ),
  ),
w7t8yxp5

w7t8yxp52#

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

相关问题