首页 > 解决方案 > FirebaseAnalytics logEvent 通过每次在 Flutter 中创建一个新实例

问题描述

我正在将 Google Analytics 添加到我的 Flutter 项目中。可以在这样的静态函数中记录事件吗?

static Future<void> logEvent(String eventName) async {
  await FirebaseAnalytics().logEvent(name: eventName);
}

每次调用该函数时都会初始化 FirebaseAnalytics。这会导致问题吗?

标签: flutterdartgoogle-analyticsfirebase-analytics

解决方案


除了小开销之外,它不会引起任何问题,但是将它作为单例很好。例如,稍后您可能会意识到用一些自定义逻辑包装分析报告是有意义的,并且您不想复制它。InheritedWidget有助于从树的任何位置获取相同的对象实例。

class Analytics extends InheritedWidget {
 final FirebaseAnalytics _analytics;

  Analytics(this._analytics, Widget child) : super(child: child);

  @override
  bool updateShouldNotify(Analytics oldWidget) {
    return _analytics != oldWidget._analytics;
  }

  static FirebaseAnalytics of(BuildContext context) {
    final provider =
        (context.getElementForInheritedWidgetOfExactType<Analytics>()?.widget) as Analytics;

    assert(provider != null);

    return provider._analytics;
  }
}

构建应用程序时,将其放在小部件树的 op 上:

@override
Widget build(BuildContext context) {
    FirebaseAnalytics analytics = FirebaseAnalytics();
    var firebaseAnalyticsObserver = FirebaseAnalyticsObserver(
      analytics: analytics,
    );
    return Analytics(
      analytics,
      MaterialApp(
        navigatorObservers: [
          firebaseAnalyticsObserver,
        ],
        ...

从树下方的任何小部件访问它:

Analytics.of(context).logEvent(name: "my_custom_event");

推荐阅读