【问题标题】:RouteObserver for GoRouter to catch go/goNamed transitionsGoRouter 的 RouteObserver 捕捉 go/goNamed 转换
【发布时间】:2023-01-03 23:42:08
【问题描述】:

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


例如,

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

/pageA/pageB 的过渡不是。

【问题讨论】:

    标签: flutter routes navigation observers flutter-go-router


    【解决方案1】:

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

    【讨论】:

      【解决方案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');
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 2017-07-15
        • 1970-01-01
        • 2014-07-23
        • 2012-08-22
        • 1970-01-01
        • 2012-11-14
        相关资源
        最近更新 更多