import 'dart:async'; import 'dart:developer'; import 'package:bloc/bloc.dart'; import 'package:flutter/widgets.dart'; import 'package:get_it/get_it.dart'; import 'package:xiao_pet_tracker/app_router/app_router.dart'; import 'package:xiao_pet_tracker/objectbox.dart'; final getIt = GetIt.instance; 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); } } Future bootstrap(FutureOr Function() builder) async { FlutterError.onError = (details) { log(details.exceptionAsString(), stackTrace: details.stack); }; Bloc.observer = const AppBlocObserver(); // Add cross-flavor configuration here WidgetsFlutterBinding.ensureInitialized(); final AppRouter appRouter = getIt.registerSingleton(AppRouter()); final ObjectBox objectBox = getIt.registerSingleton(await ObjectBox.create()); runApp(await builder()); }