From cc88179bf592f36915661d66e5020bca4dce4b82 Mon Sep 17 00:00:00 2001 From: Sandip Date: Fri, 28 Jun 2024 20:40:02 +0530 Subject: [PATCH] chore: add bloc observer, set up zone guards --- lib/app_bloc_observer.dart | 23 +++++++++++++++++++++++ lib/bootstrap.dart | 38 ++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 lib/app_bloc_observer.dart diff --git a/lib/app_bloc_observer.dart b/lib/app_bloc_observer.dart new file mode 100644 index 0000000..2cb86b4 --- /dev/null +++ b/lib/app_bloc_observer.dart @@ -0,0 +1,23 @@ +import 'dart:developer'; +import 'package:bloc/bloc.dart'; + +/// {@template app_bloc_observer} +/// Custom instance of [BlocObserver] which logs +/// any state changes and errors. +/// {@endtemplate} +class AppBlocObserver extends BlocObserver { + /// {@macro app_bloc_observer} + const AppBlocObserver(); + + @override + void onChange(BlocBase bloc, Change change) { + super.onChange(bloc, change); + log('onChange(${bloc.runtimeType}, $change)'); + } + + @override + void onError(BlocBase bloc, Object error, StackTrace stackTrace) { + log('onError(${bloc.runtimeType}, $error, $stackTrace)'); + super.onError(bloc, error, stackTrace); + } +} diff --git a/lib/bootstrap.dart b/lib/bootstrap.dart index 558f731..c8920e0 100644 --- a/lib/bootstrap.dart +++ b/lib/bootstrap.dart @@ -2,32 +2,30 @@ import 'dart:async'; import 'dart:developer'; import 'package:bloc/bloc.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; +import 'package:sudoku/app_bloc_observer.dart'; -class AppBlocObserver extends BlocObserver { - const AppBlocObserver(); - - @override - void onChange(BlocBase bloc, Change change) { - super.onChange(bloc, change); - log('onChange(${bloc.runtimeType}, $change)'); - } - - @override - void onError(BlocBase bloc, Object error, StackTrace stackTrace) { - log('onError(${bloc.runtimeType}, $error, $stackTrace)'); - super.onError(bloc, error, stackTrace); - } -} - +/// Bootstrap is responsible for any common setup and calls +/// [runApp] with the widget returned by [builder] in an error zone. Future bootstrap(FutureOr Function() builder) async { + // Log all uncaught build phase errors from the framework FlutterError.onError = (details) { log(details.exceptionAsString(), stackTrace: details.stack); }; - Bloc.observer = const AppBlocObserver(); - - // Add cross-flavor configuration here + // Log all uncaught asynchronous errors that aren't handled + // by the Flutter framework. + PlatformDispatcher.instance.onError = (error, stack) { + log(error.toString(), stackTrace: stack); + return true; + }; - runApp(await builder()); + await runZonedGuarded( + () async { + Bloc.observer = const AppBlocObserver(); + runApp(await builder()); + }, + (error, stackTrace) => log(error.toString(), stackTrace: stackTrace), + ); }