web-dev-qa-db-fra.com

Comment suivre les écrans Flutter dans les analyses Firebase?

J'ai une application Flutter et je teste Google Analytics pour Firebase sur Flutter.

Je voulais voir les itinéraires que nos utilisateurs (enfin, moi pour l'instant) visitent. J'ai suivi les étapes de configuration dans firebase_analytics et j'ai également vérifié leur exemple d'application. J'ai activé le débogage pour Analytics comme décrit dans les Debug View docs

Malheureusement, les deux seuls types de vues d'écran (firebase_screen_class) Je reçois dans ma vue de débogage Analytics: Flutter et MainActivity.

Je m'attends à voir /example-1, /example-2 et /welcome quelque part, mais pas moi.

Ceci est l'application que j'utilise dans Flutter

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)],
    );
  }
}
10
Vince Varga

Ce cas d'utilisation exact se trouve dans la documentation de Firebase Analytics sous la section Track Screenviews .

Le suivi manuel des écrans est utile si votre application n'utilise pas un UIViewController ou une activité distincte pour chaque écran que vous souhaitez suivre, comme dans un jeu.

C'est exactement le cas avec Flutter, car Flutter s'occupe des mises à jour de l'écran, il n'est donc pas possible de laisser Firebase Analytics suivre automatiquement les écrans.

Vous devez vous assurer que les routes ont accès à l'instance de FirebaseAnalytics, puis définir manuellement le nom d'écran (j'ai défini dans le constructeur de widget comme recommandé dans les commentaires, mais il pourrait aussi y avoir une meilleure façon).

analytics.setCurrentScreen(screenName: 'Example1');

En option pour simplifier cela, j'ai ajouté une classe abstraite

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

alors je peux utiliser cette classe comme mixin dans mes routes, par exemple dans StatefulWidgets

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

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

  Example() {
    setCurrentScreen();
  }
}

L'avantage est que vous pouvez utiliser setCurrentScreen() et que vous n'oubliez pas le nom d'écran, mais comme inconvénient, vous devez toujours vous rappeler d'appeler setCurrentScreen dans le constructeur du widget .. Si vous avez une solution Dart plus idiomatique pour cela, faites-le moi savoir dans les commentaires.

La solution ci-dessus pourrait (ne l'a pas testée assez bien pour dire définitivement) ne fonctionnerait pas, une amélioration pourrait être d'utiliser RouteAware dans ces classes.

12
Vince Varga