createErrorEvent method

Future<void> createErrorEvent({
  1. required String message,
  2. Object? error,
  3. StackTrace? stackTrace,
  4. String? title,
  5. String? subtitle,
  6. String? originalMessage,
  7. String? traceId,
  8. String? messageStatus,
})

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);
  }
}