addEvent method

void addEvent({
  1. required String code,
  2. required String name,
  3. required EventType type,
  4. int? timestamp,
  5. required String? belongPage,
  6. Map<String, String>? extra,
  7. required VoidCallback onSuccess,
  8. required VoidCallback onError,
})

打点

Implementation

void addEvent({
  required String code,
  required String name,
  required EventType type,
  int? timestamp,
  required String? belongPage,
  Map<String, String>? extra,
  required VoidCallback onSuccess,
  required VoidCallback onError,
}) {
  var newTimestamp = timestamp ?? DateTime.now().millisecondsSinceEpoch;
  if (type == EventType.pageIn) {
    // 退出上一个页面
    if (currentPageCode.isNotEmpty) {
      addEvent(
        code: currentPageCode,
        name: _currentPageName,
        type: EventType.pageOut,
        timestamp: newTimestamp - 1,
        belongPage: currentPageCode,
        onSuccess: () {},
        onError: () {},
      );
    }
    // 记录新页面
    currentPageCode = code;
    _currentPageName = name;
    _currentPageExtra = extra;
  }

  // Firebase打点
  FirebaseAnalyticTool.addEvent(name: "${code}_${type.firebaseTypeCode}");

  // 接口记录
  recordEvent(
    sessionId: _sessionId,
    eventCode: code,
    eventName: type.eventNamePrefix.replaceAll("@name", name),
    eventType: type,
    timestamp: newTimestamp,
    belongPage: belongPage,
    extra: extra,
    onSuccess: onSuccess,
    onError: () {
      onError();
      // 记录失败的事件
      if (!_ignoreFailedEventCodes.contains(code)) {
        var model = AnalyticModel(
          sessionId: _sessionId,
          eventCode: code,
          eventName: name,
          eventType: type,
          timestamp: newTimestamp,
          belongPage: belongPage,
          extra: extra,
        );
        var data = jsonEncode(model);
        var errorModel = AnalyticErrorModel(data: data);
        AnalyticErrorDb.getInstance().then((db) => db.insert(row: errorModel));
      }
    },
  );
}