You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HMG_QLine/lib/services/crash_handler_service.dart

59 lines
2.3 KiB
Dart

// filepath: /Volumes/Data/Projects/Flutter/HMG_QLine/lib/services/crash_handler_service.dart
import 'dart:async';
import 'dart:developer';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:hmg_qline/services/logger_service.dart';
// Abstract interface for crash handling (matches style of ConnectivityService)
abstract class CrashHandlerService {
/// Install global error handlers for Flutter and platform errors.
void setupGlobalErrorHandlers();
/// Central crash handler for logging/reporting crashes.
Future<void> handleCrash({required Object error, StackTrace? stackTrace, String? context});
}
class CrashHandlerServiceImp implements CrashHandlerService {
final LoggerService loggerService;
CrashHandlerServiceImp({required this.loggerService});
/// Sets up global error handlers for Flutter framework errors and platform errors.
@override
void setupGlobalErrorHandlers() {
// Flutter framework errors
FlutterError.onError = (FlutterErrorDetails details) async {
try {
final error = details.exception;
final stack = details.stack;
await handleCrash(error: error, stackTrace: stack, context: 'FlutterError.onError');
} catch (e, st) {
// include stack trace in the log to avoid unused variable warning
log('Error while handling FlutterError.onError: $e\nStack: $st');
loggerService.logError('Error while handling FlutterError.onError: $e\nStack: $st');
}
};
// PlatformDispatcher (engine) errors
PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
handleCrash(error: error, stackTrace: stack, context: 'PlatformDispatcher.onError');
return true; // we handled it
};
// note: Zone errors are handled by runZonedGuarded where runApp is invoked
}
/// Central crash handler. Logs crash info and can be extended to report to remote services.
@override
Future<void> handleCrash({required Object error, StackTrace? stackTrace, String? context}) async {
try {
await loggerService.logCrash(error: error, stackTrace: stackTrace, context: context);
} catch (e) {
// ensure we don't throw while handling crashes
log('CrashHandlerService failed to log crash: $e');
loggerService.logError('CrashHandlerService failed to log crash: $e');
}
}
}