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)],
);
}
}
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 StatefulWidget
s
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.