【问题标题】:FirebaseAnalytics logEvent by creating a new instance each time in FlutterFirebaseAnalytics logEvent 通过每次在 Flutter 中创建一个新实例
【发布时间】:2020-04-20 12:05:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: flutter dart google-analytics firebase-analytics


    【解决方案1】:

    除了一点点开销之外不会引起任何问题,但是将它作为单例很好。例如,稍后您可能会意识到用一些自定义逻辑包装分析报告是有意义的,并且您不想复制它。 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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多