Как отслеживать экраны Flutter в аналитике Firebase? - PullRequest
3 голосов
/ 24 апреля 2019

У меня есть приложение Flutter, и я тестирую Google Analytics для Firebase на Flutter.

Я хотел посмотреть маршруты, которые посещают наши пользователи (ну, я пока).Я выполнил шаги настройки в firebase_analytics и также проверил их пример приложения.Я включил отладку для Analytics, как описано в документах Просмотр отладки

К сожалению, только два вида экранных представлений (firebase_screen_class), которые я получаю в моем представлении отладки Analytics, - Flutter иMainActivity.

Я бы ожидал где-нибудь увидеть /example-1, /example-2 и /welcome, но я не вижу.

Это приложение, в котором я работаюФлаттер

class App extends StatelessWidget {
  final FirebaseAnalytics analytics = FirebaseAnalytics();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: <String, WidgetBuilder>{
        '/example-1': (_) => Example1(),
        '/example-2': (_) => Example2(),
        '/welcome': (_) => Welcome(),
      },
      home: Welcome(),
      navigatorObservers: [FirebaseAnalyticsObserver(analytics: analytics)],
    );
  }
}

1 Ответ

4 голосов
/ 24 апреля 2019

Этот точный пример использования приведен в документации по Firebase Analytics в разделе Отслеживание экранов .

Отслеживание экранов вручную полезно, если ваше приложение не использует отдельный UIViewControllerили Активность для каждого экрана, который вы можете отслеживать, например, в игре.

Это точно так же, как и в случае с Flutter, поскольку Flutter заботится об обновлениях экрана, поэтому Firebase Analytics автоматически отслеживаетэкраны невозможны.

Необходимо убедиться, что маршруты имеют доступ к экземпляру FirebaseAnalytics, а затем вручную установить имя экрана (я установил в конструкторе виджета, как рекомендовано в комментариях, но там может бытьбудь более хорошим, тоже).

analytics.setCurrentScreen(screenName: 'Example1');

По желанию, чтобы упростить это, я добавил абстрактный класс

abstract class AnalyticsScreen {
  String get screenName;
  // FirebaseAnalytics constructor reuses a single instance, so it's ok to call like this
  void setCurrentScreen() =>
      FirebaseAnalytics().setCurrentScreen(screenName: screenName);
}

, затем я могу использовать этот класс в качестве mixin в моих маршрутах, дляпример в StatefulWidget s

class Example extends StatefulWidget with AnalyticsScreen {
  @override
  get screenName => 'example';

  @override
  _ExampleState createState() => _ExampleState();

  Example() {
    setCurrentScreen();
  }
}

Плюс в том, что вы можете использовать setCurrentScreen(), и вы не забудете псевдоним, но в качестве минуса вы по-прежнему имеетеНе забудьте вызвать setCurrentScreen в конструкторе виджета ... Если у вас есть более идиоматическое решение Dart для этого, дайте мне знать в комментариях.

Решение, приведенное выше, может (не тестировалосьэто достаточно хорошо, чтобы сказать определенно) не работает, одним из улучшений может быть использование RouteAware в этих классах.

...