flutter - FirebaseAnalytics logEvent 通过每次在 Flutter 中创建一个新实例
问题描述
我正在将 Google Analytics 添加到我的 Flutter 项目中。可以在这样的静态函数中记录事件吗?
static Future<void> logEvent(String eventName) async {
await FirebaseAnalytics().logEvent(name: eventName);
}
每次调用该函数时都会初始化 FirebaseAnalytics。这会导致问题吗?
解决方案
除了小开销之外,它不会引起任何问题,但是将它作为单例很好。例如,稍后您可能会意识到用一些自定义逻辑包装分析报告是有意义的,并且您不想复制它。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");
推荐阅读
- powershell - Powershell中基于其他参数值的动态参数
- algorithm - 什么排序算法的最坏情况时间复杂度为 O(n!)
- angular - Angular 10 - 文档中的错误未定义
- azure-devops - Azure DevOps 发布管道:找不到新的“导出 YAML”菜单项
- assembly - 关于 MIPS I 型指令符号扩展的困惑
- javascript - 是否存在未从 chrome 中删除未引用的 JavaScript 变量的实例?
- r - 在R中将数字转换为日期
- ios - 使用 xcodebuild 和 measure() 为性能测试设置基线?
- python - Plotly:如何使用散点图显示 multiIndex 数据框?
- node.js - 如何解决:internal/modules/cjs/loader.js:883