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.
59 lines
2.3 KiB
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');
|
|
}
|
|
}
|
|
}
|