Ответ
При необработанном исключении в Dart выбрасывается объект, унаследованный от класса Error или Exception, и выполнение потока прерывается.
Основные типы ошибок, которые я чаще всего вижу в логах:
RangeError(подклассError): Выход за границы коллекции.var list = [1, 2]; print(list[5]); // RangeError (index): Invalid value: Not in range 0..1, inclusiveNoSuchMethodError(подклассError): Вызов метода или геттера уnullили несуществующего члена.String? nullableString; print(nullableString.length); // NoSuchMethodError: The getter 'length' was called on null.StateError: Нарушение инварианта объекта (например, вызовaddна закрытомEventSink).
Обработка: Для глобального перехвата таких ошибок в Flutter-приложении я настраиваю:
void main() {
FlutterError.onError = (details) {
// Отправляем в Crashlytics/Sentry
myCrashReportingTool.recordError(details.exception, details.stack);
};
PlatformDispatcher.instance.onError = (error, stack) {
// Перехват ошибок вне контекста Flutter
myCrashReportingTool.recordError(error, stack);
return true; // Предотвращаем завершение изолятора
};
runApp(const MyApp());
}
Это позволяет логировать краши и, по возможности, gracefully завершать работу приложения.