From 3869a71bd1306e6b8e2f7c06c44d01e7c0a48c3f Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Thu, 5 Sep 2024 03:59:20 +0100 Subject: [PATCH] CW-695: Fix Zone Mismatch Error Triggered By Restoring Backup (#1651) * Fix: Zone mismatch error triggered by restoring backup * fix: Adjust check for reinitializing --- lib/main.dart | 81 ++++++++++++------- .../restore_from_backup_view_model.dart | 2 +- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index aeb76b3a8..86a278fdc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,11 +48,14 @@ final rootKey = GlobalKey(); final RouteObserver> routeObserver = RouteObserver>(); Future main() async { + await runAppWithZone(); +} +Future runAppWithZone() async { bool isAppRunning = false; + await runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); - FlutterError.onError = ExceptionHandler.onError; /// A callback that is invoked when an unhandled error occurs in the root @@ -62,42 +65,14 @@ Future main() async { return true; }; - - await setDefaultMinimumWindowSize(); - - await CakeHive.close(); - - await initializeAppConfigs(); + await initializeAppAtRoot(); runApp(App()); - isAppRunning = true; }, (error, stackTrace) async { if (!isAppRunning) { runApp( - MaterialApp( - debugShowCheckedModeBanner: false, - scrollBehavior: AppScrollBehavior(), - home: Scaffold( - body: SingleChildScrollView( - child: Container( - margin: EdgeInsets.only(top: 50, left: 20, right: 20, bottom: 20), - child: Column( - children: [ - Text( - 'Error:\n${error.toString()}', - style: TextStyle(fontSize: 22), - ), - Text( - 'Stack trace:\n${stackTrace.toString()}', - style: TextStyle(fontSize: 16), - ), - ], - ), - ), - ), - ), - ), + TopLevelErrorWidget(error: error, stackTrace: stackTrace), ); } @@ -105,6 +80,12 @@ Future main() async { }); } +Future initializeAppAtRoot({bool reInitializing = false}) async { + if (!reInitializing) await setDefaultMinimumWindowSize(); + await CakeHive.close(); + await initializeAppConfigs(); +} + Future initializeAppConfigs() async { setRootDirFromEnv(); final appDir = await getAppDir(); @@ -338,3 +319,41 @@ class _HomeState extends State<_Home> { return const SizedBox.shrink(); } } + +class TopLevelErrorWidget extends StatelessWidget { + const TopLevelErrorWidget({ + required this.error, + required this.stackTrace, + super.key, + }); + + final Object error; + final StackTrace stackTrace; + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + scrollBehavior: AppScrollBehavior(), + home: Scaffold( + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.only(top: 50, left: 20, right: 20, bottom: 20), + child: Column( + children: [ + Text( + 'Error:\n${error.toString()}', + style: TextStyle(fontSize: 22), + ), + Text( + 'Stack trace:\n${stackTrace.toString()}', + style: TextStyle(fontSize: 16), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/view_model/restore_from_backup_view_model.dart b/lib/view_model/restore_from_backup_view_model.dart index 365afb1fa..432cac67e 100644 --- a/lib/view_model/restore_from_backup_view_model.dart +++ b/lib/view_model/restore_from_backup_view_model.dart @@ -46,7 +46,7 @@ abstract class RestoreFromBackupViewModelBase with Store { final data = await file.readAsBytes(); await backupService.importBackup(data, password); - await main(); + await initializeAppAtRoot(reInitializing: true); final store = getIt.get(); ReactionDisposer? reaction;