Flutter Firebase Analytics: 使用 onGenerateRoute 跟踪页面更改

6

我已经为我的应用启用了 Firebase Analytics,并尝试使用 Firebase 调试视图显示我的页面更改。但是,当前使用下面的代码跟踪不到任何东西,我不明白为什么。我已经按照 Firebase 文档中有关跟踪页面浏览量的说明进行操作,但显然在使用 onGenerateRoute 时我漏掉了一些东西。

我的主要代码:

class MyApp extends StatelessWidget {
  static FirebaseAnalytics analytics = FirebaseAnalytics();
  static FirebaseAnalyticsObserver observer =
      FirebaseAnalyticsObserver(analytics: analytics);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: "localhour",
        onGenerateRoute: router.generateRoute,
        initialRoute: '/',
        navigatorObservers: <NavigatorObserver>[observer],
      ),
    );
  }
}

我的generateRoute函数:

Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case '/':
      return MaterialPageRoute(builder: (context) => RootPage());
      break;
    case '/login':
      return MaterialPageRoute(builder: (context) => LoginPage());
      break;
    case '/home':
      var user = settings.arguments;
      return MaterialPageRoute(
          builder: (context) => HomePage(
                user: user,
              ));
      break;
    case '/store':
      return MaterialPageRoute(builder: (context) => StorePage());
      break;
    case '/store-details':
      var argument = settings.arguments;
      return MaterialPageRoute(
          builder: (context) => StoreDetails(
                storeDetails: argument,
              ));
      break;
  }
}

我之前在一款应用中使用过分析工具以自动追踪页面变化,但是我的主要函数中使用了“路由”方法。有人能解释一下为什么我使用上述方法没有得到任何反馈吗?屏幕必须被明确命名吗?(我也尝试过,但没有成功)

2个回答

7

嘿,如果你仍在寻找这个问题的答案,那是因为你没有将名称推入MaterialPageRoute中。

因此,在你的generateRoute函数中:

  '/login':
      return MaterialPageRoute(
         builder: (context) => LoginPage(),
         settings: RouteSettings(name: settings.name));
      break;

这将为您将名称推送到Firebase Analytics。只需在switch的每个case中添加它即可。


嘿,我实际上忘记了这篇帖子,并在其他地方找到了类似的解决方案。但你获得了胜利的标记。谢谢。 - Michael Tolsma
我如何在“generateRoute”中访问我在“MyApp”中拥有的“FirebaseAnalytics”对象? - Rony Tesler
嘿@RonyTesler,你可以用几种方法来解决这个问题,但我更喜欢Dane Mackier的解决方案,这是他的文章链接:https://www.filledstacks.com/post/firebase-analytics-and-metrics-in-flutter/ - Tyrell James

0

所以,@TyrellJames已经给出了一个可靠的答案,但这是我使用的解决方案。最终我彻底改变了代码结构,以便添加routeName值,这样Firebase才知道我的页面叫什么:

Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case RootRoute:
      return _getPageRoute(
        routeName: settings.name,
        viewToShow: RootPage(),
      );
    .
    .
    .
}

然后我编写了_getPageRoute函数:

PageRoute _getPageRoute({String routeName, Widget viewToShow}) {
  return MaterialPageRoute(
    settings: RouteSettings(
      name: routeName,
    ),
    builder: (_) => viewToShow
  );
}

这基本上就是 @TyrellJames 所做的,我的只是绕了一个大弯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接