createErrorEvent method
Crea un evento de error manual para Flutter/Dart con estructura estándar
Los parámetros siguen la estructura estándar de Android/iOS/JS:
- title: Tipo principal del error
- subtitle: Primera línea del stack trace o contexto
- message: null (para mantener consistencia con otras plataformas)
- originalMessage: Stack trace completo o mensaje del error
- traceId: Identificador único del evento
- messageStatus: Estado/categoría del mensaje
Implementation
Future<void> createErrorEvent({
required String message,
Object? error,
StackTrace? stackTrace,
String? title,
String? subtitle,
String? originalMessage,
String? traceId,
String? messageStatus,
}) async {
final hub = _hub;
if (!_isInitialized || hub == null) {
ObslyLogger.error('CrashController not initialized');
return;
}
// Check if crashes are enabled
final config = ConfigController.instance.config;
if (!(config?.enableCrashes ?? DefaultConfiguration.enableCrashes)) {
ObslyLogger.debug('Crashes disabled, ignoring createErrorEvent call');
return;
}
final reservation = hub.reserveEventMetadata();
try {
// Construir información del error
final errorType = error?.runtimeType.toString() ?? 'ManualError';
final errorMessage = error?.toString() ?? message;
// Construir stack trace completo si no se proporciona
String stackTraceStr =
stackTrace?.toString() ?? StackTrace.current.toString();
// Si el error contiene stack trace, usarlo
if (error != null && errorMessage.contains('\n') && stackTrace == null) {
stackTraceStr = errorMessage;
}
// Determinar title: usar parámetro o extraer del tipo de error
final finalTitle = title ?? _extractErrorTitle(errorType, errorMessage);
// Determinar subtitle: usar parámetro o extraer primera línea relevante del stack
final finalSubtitle = subtitle ?? _extractErrorSubtitle(stackTraceStr);
// Usar originalMessage proporcionado o el stack trace completo
final finalOriginalMessage = originalMessage ?? stackTraceStr;
// Determinar messageStatus basado en el contexto
final finalMessageStatus =
messageStatus ?? _determineMessageStatus(errorType, message);
// Crear evento de crash con estructura estándar
final crashEvent = CrashEventBase(
title: finalTitle,
subtitle: finalSubtitle,
message: null, // Mantener null para consistencia con otras plataformas
originalMessage: finalOriginalMessage,
traceId: traceId,
messageStatus: finalMessageStatus,
);
// Capturar el evento
hub.captureEvent(crashEvent, reservation);
await MetricsController.instance
.generateCrashMetric(crashEvent.timestamp);
ObslyLogger.debug(
'Manual crash event created: $finalTitle - $finalMessageStatus');
} catch (e, st) {
ObslyLogger.error('Error creating manual crash event: $e', st);
}
}