firebase - 如何在不在每个屏幕中传递 'analytics/observer' 对象的情况下在 Flutter 中设置 Firebase Analytics 自定义事件

标签 firebase flutter google-analytics firebase-analytics bloc

我正在为我的 Flutter 项目设置 Firebase Analytics Package。库中提供的 sample 传递用于跟踪事件的 analytics 对象和用于跟踪选项卡更改的 observer

class MyApp extends StatelessWidget {
 ...
Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Analytics Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: <NavigatorObserver>[observer],
      home: MyHomePage(
        title: 'Firebase Analytics Demo',
        analytics: analytics,
        observer: observer,
      ),
    );
  }
}

...

class _MyHomePageState extends State<MyHomePage> {
...
Future<void> _sendAnalyticsEvent() async {
    await analytics.logEvent(
      name: 'test_event',
      parameters: <String, dynamic>{
        'string': 'string',
        'int': 42,
        'long': 12345678910,
        'double': 42.0,
        'bool': true,
      },
    );
    setMessage('logEvent succeeded');
  }
...
}

我的应用程序包含许多屏幕,其中的状态通过 Bloc 包进行管理。将这些对象从 mainScreen 一直传递到事件发生的树下并不是一件好事。

有没有一种方法可以访问它们而无需在小部件树周围传递它们。或者,如果我创建类 FirebaseAnalytics 的新对象并使用生成的对象设置事件,它会起作用吗?

static FirebaseAnalytics analytics = FirebaseAnalytics();

或者我应该使用 Flutter_Bloc 作为记录和设置我的 Flutter 事件的中心位置吗?

最佳答案

您可以使用 provider 包在您的小部件树下“提供”您的分析和观察者。

class MyApp extends StatelessWidget {
  static FirebaseAnalytics analytics = FirebaseAnalytics();
  static FirebaseAnalyticsObserver observer =
      FirebaseAnalyticsObserver(analytics: analytics);

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
            Provider<FirebaseAnalytics>.value(value: analytics),
            Provider<FirebaseAnalyticsObserver>.value(value: observer),
        ],
        child: MaterialApp(
            title: 'Firebase Analytics Demo',
            theme: ThemeData(
                primarySwatch: Colors.blue,
            ),
            navigatorObservers: <NavigatorObserver>[observer],
            home: MyHomePage(
                title: 'Firebase Analytics Demo',
            ),
        ),
    ); 
  }
}

然后在您的任何子部件中...

Future<void> _sendAnalyticsEvent() async {
    FirebaseAnalytics analytics = Provider.of<FirebaseAnalytics>(context);
    await analytics.logEvent(
      name: 'test_event',
      parameters: <String, dynamic>{
        'string': 'string',
        'int': 42,
        'long': 12345678910,
        'double': 42.0,
        'bool': true,
      },
    );
    setMessage('logEvent succeeded');
  }

现在您不需要将 Firebase 实例传递给小部件构造函数。

关于firebase - 如何在不在每个屏幕中传递 'analytics/observer' 对象的情况下在 Flutter 中设置 Firebase Analytics 自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003787/

相关文章:

Flutter 设置状态不更新 bottomsheet 函数中的变量值

javascript - 异步谷歌分析 [Javascript 高尔夫]

google-analytics - 谷歌分析页面加载样本零

angular - 如何将@angular/fire 添加到 Nx 工作区(Angular 项目)?

firebase - Flutter firebase 在关闭或在后台接收通知 - 如何将消息传递给类

ios - Firebase Remote Config A/B 测试草案不提供 iOS 上的值

ios - 打印出 firebase 子值

android - Facebook 登录与 Flutter 集成

arrays - 如何在flutter中按子列表值对列表进行排序?

ios - 添加 Google Conversion Tracking SDK iOS-3.0.0 时应用程序崩溃