toCompactStringEvent static method
Serialize event to compact NDJSON-ready string (flat structure). Core SDK fields are written last to prevent userProperties or eventParams from accidentally overwriting them.
Implementation
static String toCompactStringEvent(Event event) {
final flat = <String, dynamic>{};
// User properties first (lowest priority in case of key collision)
// Sanitize to prevent NaN/Infinity crashing jsonEncode.
if (event.userProperties != null) {
final sanitizedUserProps = JsonSanitizer.sanitize(
Map<String, dynamic>.from(event.userProperties!),
);
for (final entry in sanitizedUserProps.entries) {
flat[entry.key] = entry.value;
}
}
// Event params next (can overwrite user properties but not core fields)
if (event.eventParams != null) {
flat.addAll(
JsonSanitizer.sanitize(event.eventParams!.cast<String, dynamic>()),
);
}
// Core SDK fields last (highest priority — never overwritten)
flat['_ts'] = event.ts;
flat['event_name'] = event.eventName;
flat['install_day'] = event.installDay;
flat['user_pseudo_id'] = event.userPseudoId;
flat['retention_day'] = event.retentionDay;
flat['retention_hour'] = event.retentionHour;
flat['retention_minute'] = event.retentionMinute;
flat['session_id'] = event.sessionId;
flat['session_progress'] = event.sessionProgress;
flat['session_number'] = event.sessionNumber;
flat['event_date'] = event.eventDate;
flat['event_local_day_of_week'] = event.eventLocalDayOfWeek;
flat['event_local_hour'] = event.eventLocalHour;
flat['event_local_hour_minute'] = event.eventLocalHourMinute;
flat['sdk_ver'] = event.sdkVer;
flat['sdk_ver_num'] = event.sdkVerNum;
flat['engagement_time_msec'] = event.engagementTimeMsec;
return jsonEncode(flat);
}