Firebase Analytics自定义事件与AnalyticsEventItem

4dc9hkyq  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(144)

bounty还有2天到期。此问题的答案有资格获得+50声望奖励。Zahid Tekbaş希望引起更多关注这个问题。

在Flutter应用程序中,我尝试使用自定义参数定义自己的view_cart事件。所以我决定从firebase_analytics库中复制一些代码片段,以便成功发送数据。
下面是firebase_analytics库中的filterOutNulls函数:

Map<String, Object> filterOutNulls(Map<String, Object?> parameters) {
    final Map<String, Object> filtered = <String, Object>{};
    parameters.forEach((String key, Object? value) {
      if (value != null) {
        filtered[key] = value;
      }
    });
    return filtered;
  }

下面是firebase_analytics库中的_marshalItems函数。

List<Map<String, dynamic>>? _marshalItems(List<AnalyticsEventItem>? items) {
    if (items == null) return null;

    return items.map((AnalyticsEventItem item) => item.asMap()).toList();
  }

这是我的logEvent函数:

await FirebaseAnalytics.instance.logEvent(
        name: 'view_cart',
        parameters: filterOutNulls(<String, Object?>{
          "user_id": userId,
          "currency": convertSymbol(dvz),
          "value": totalPrice,
          "items": _marshalItems(list),
        }),
      );
// list variable is type of List<AnalyticsEventItem>

最后,终端输出:

[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: 'package:firebase_analytics/src/firebase_analytics.dart': Failed assertion: line 115 pos 9: 'value is String || value is num': 'string' OR 'number' must be set as the value of the parameter: items
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
#2      FirebaseAnalytics.logEvent.<anonymous closure> (package:firebase_analytics/src/firebase_analytics.dart:115:9)
#3      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:617:13)
#4      FirebaseAnalytics.logEvent (package:firebase_analytics/src/firebase_analytics.dart:113:17)

我不明白的是logEvent函数中的变量是logViewCart函数的精确副本。即使它们相同,logEvent函数也会抛出错误,但logViewCart不会。
有谁能告诉我我哪里做错了吗?

bnl4lu3b

bnl4lu3b1#

使用此方法

static void customLogEvent({
        required final String key,
        required final Map<String, dynamic> parameters,
      }) async {
        await FirebaseAnalytics.instance.logEvent(
          name: key,
          parameters: parameters,
        );
      }

可以将List添加到Map的Value中

List<Student> students = [
    Student(name: "John", rollno: "12", age: "26", marks: [23, 45, 35]),
    Student(name: "Krishna", rollno: "12", age: "26", marks: [23, 45, 35]),
    Student(name: "Rahul", rollno: "12", age: "26", marks: [23, 45, 35])
];
     
var studentsmap = students.map((e){
        return {
                "name": e.name, 
                "rollno": e.rollno, 
                "age": e.age, 
                "marks": e.marks
            };
    }).toList();
print(studentsmap);

输出

[
 {name: John, rollno: 12, age: 26, marks: [23, 45, 35]}, 
 {name: Krishna, rollno: 12, age: 26, marks: [23, 45, 35]}, 
 {name: Rahul, rollno: 12, age: 26, marks: [23, 45, 35]}
]
7ajki6be

7ajki6be2#

我在FlutterFire Github(check this out)中打开了一个问题,我看到我想做的事情不受Google支持。无法在自定义logEvent中将对象列表分配给items参数。
所以我必须坚持使用Firebsase Analytics允许的预定义日志功能。

相关问题