首页 > 解决方案 > 如何在 Flutter 中设置 Firebase Analytics 自定义事件,而不在每个屏幕中传递“分析/观察者”对象

问题描述

我正在为我的 Flutter 项目设置Firebase 分析包。库中提供的示例传递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 事件的中心位置?

标签: firebasefluttergoogle-analyticsfirebase-analyticsbloc

解决方案


您可以使用该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 实例传递给小部件构造函数。


推荐阅读