Search code examples
flutterdartflutter-bloc

The Flutter bindings were initialized in a different zone than is now being used


I'm getting an error related to Flutter bindings being initialized in a different zone.

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  MyApp app = MyApp();

// Run the whole app in a zone to capture all uncaught errors.

  runZonedGuarded(() => runApp(app), (Object error, StackTrace stackTrace) {
    if (isInDebugMode) {
      print(error);
      print(stackTrace);
      print('In dev mode. Not sending report to Sentry.io.');
      return;
    }

    SentryClient? sentryClient =
        app.myProviderKey.currentState?.sentryClient;

    try {
      sentryClient?.captureException(
        error,
        stackTrace: stackTrace,
      );
      print('Error sent to sentry.io: $error');
    } catch (e) {
      print('Sending report to sentry.io failed: $e');
      print('Original error: $error');
    }
  });
}

I've added

WidgetsFlutterBinding.ensureInitialized();

at the start of main() because of an error I encountered earlier which is

Unhandled Exception: Binding has not yet been initialized.

The above error has disappeared but the Zone error has cropped up. Help appreciated.


Solution

  • Move it to inside the runZonedGuarded, like:

    Future<void> main() async {
      MyApp? app;
      // Run the whole app in a zone to capture all uncaught errors.
    
      runZonedGuarded((){
          WidgetsFlutterBinding.ensureInitialized();
          app = MyApp();
          runApp(app!);
        }, (Object error, StackTrace stackTrace) {
        if (isInDebugMode) {
          print(error);
          print(stackTrace);
          print('In dev mode. Not sending report to Sentry.io.');
          return;
        }
    
        SentryClient? sentryClient =
            app?.myProviderKey.currentState?.sentryClient;
    
        try {
          sentryClient?.captureException(
            error,
            stackTrace: stackTrace,
          );
          print('Error sent to sentry.io: $error');
        } catch (e) {
          print('Sending report to sentry.io failed: $e');
          print('Original error: $error');
        }
      });
    }