Flutter: Excepción no controlada: Se accedió a ServicesBinding.defaultBinaryMessenger antes de que se inicializara el enlace

134

¿Alguna solución para solucionar este problema?

Stacktrace:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
If you're running an application and need to access the binary messenger before `runApp()` has been called (for example, during plugin initialization), then you need to explicitly call the `WidgetsFlutterBinding.ensureInitialized()` first.
If you're running a test, you can call the `TestWidgetsFlutterBinding.ensureInitialized()` as the first line in your test's `main()` method to initialize the binding.
#0      defaultBinaryMessenger.<anonymous closure> (package:flutter/src/services/binary_messenger.dart:73:7)
#1      defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:86:4)
#2      MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:140:62)
#3      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:314:35)
<asynchronous suspension>
#4      MethodChannel.invokeMapMethod (package:f<>
Sopheap de Sopheadavid
fuente
ponga esta línea como su primera declaración en main () - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Respuestas:

312

Este problema se presenta al actualizar Flutter. La razón detrás de esto es que está esperando algunos datos o ejecutando una asyncfunción dentromain() .

Estaba inicializando por ScopedModeldentro main()y por dentro que estaba esperando algunos datos.

Hay una pequeña solución. Solo corre WidgetsFlutterBinding.ensureInitialized()adentro void main(), antes de hacerlo runApp(). ¡¡Funciona de maravilla!!

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(Delta(
    model: ProductDataModel(),
  ));
}
Debasmita Sarkar
fuente
17
asegúrese de que WidgetFlutterBinding.ensureInitialized () sea la primera línea de main (). y luego proceda como de costumbre
Avnish kumar
10
¿Cuál es el impacto negativo potencial de esto? ¿Todas las aplicaciones de flutter deberían tener esa línea al principio del main()método?
user482594
3
Si está utilizando el método asincrónico en main (), debe agregar esto
Debasmita Sarkar
2
no funciona para v1.14.4 / v1.14.6 break en var databasePath = await getDatabasesPath ();
Ares91
70

Esto generalmente sucede si está esperando el main()método. Entonces, la solución sería:

void main() {
  // add this, and it should be the first line in main method
  WidgetsFlutterBinding.ensureInitialized(); 

  // rest of your app code
  runApp(
    MaterialApp(...),
  );
}
CopsOnRoad
fuente
1
no funciona: se rompe en la unión (aguarda getDatabasesPath (), 'mydb.db'),
amor vivo
25

No estoy seguro de tener la respuesta correcta, pero obtuve el mismo error después de una actualización reciente de Flutter y logré que funcione, así que estoy compartiendo mis hallazgos.

Parece que el error podría deberse a un cambio importante reciente: https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Como resultado, necesitamos cambiar manualmente el código de la siguiente manera:

  • Si está ejecutando una aplicación y necesita acceder al mensajero binario antes de que runApp()se haya llamado (por ejemplo, durante la inicialización del complemento), entonces debe llamar explícitamente al WidgetsFlutterBinding.ensureInitialized() primero.
  • Si está ejecutando una prueba, puede llamar a TestWidgetsFlutterBinding.ensureInitialized()como la primera línea en el main()método de su prueba para inicializar el enlace.

Alternativamente, si usted es un novato como yo y tiene dificultades para comprender lo anterior y el # 38464 , puede evitar temporalmente este problema cambiando al canal beta. Simplemente ejecute "flutter channel beta". El cambio decisivo aún no está en el canal beta, por lo que después de cambiar al canal beta, al menos por ahora no obtendría este error.

Marte
fuente
Gracias hermano, ¡acabo de usar la versión beta para evitar errores!
Sopheadavid Sopheap
11

solo agrega esta línea en main.dart

WidgetsFlutterBinding.ensureInitialized(); 

tu código parece

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  return runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider.value(
        value: AppState(),
      )
    ],
    child: MyApp(),
  ));
}
Saad Ahmed
fuente
2

en mi caso al usar la orientación,

antes resuelto:

void main() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_).{
runApp(MyApp());
});
}

uso resuelto:

void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
  .then((_) {
runApp(MyApp());
});
}

El punto es agregar WidgetsFlutterBinding.ensureInitialized () en la primera línea de la clase principal

arjava
fuente
2

Podría encontrarse con esto si está intentando ejecutar el código nativo del complemento de forma aislada. La documentación isolate_handler aquí explica esto bien:

Los complementos utilizan un mecanismo llamado canal de plataforma para comunicarse entre el Dart y los lados nativos, un mecanismo de paso de mensajes que utiliza el tipo MethodChannel. Este mecanismo depende de los elementos del motor de IU subyacente para funcionar.

El problema aquí es que los aislamientos proporcionarán un aumento del rendimiento solo en el caso de un código dart computacionalmente costoso. El código de la plataforma del complemento volverá a utilizar el hilo principal (UI).

Llamar WidgetsFlutterBinding.ensureInitializeddentro de un aislado también fallará debido a la ausencia de un motor de IU subyacente en el aislado.

sjsam
fuente
1

Antes de tener la versión v1.12.13+hotfix.5, luego cambié a la versiónv1.14.4 y funcionó.

El error dice que debería agregar WidgetsFlutterBinding.ensureInitialized();, pero como eso no funcionó para mí, cambié a la otra versión. Sin embargo, una cosa a tener en cuenta es que aún debe agregar WidgetsFlutterBinding.ensureInitialized();como la primera línea en su principal.

Hanslissi
fuente
1

Solución: llame WidgetsFlutterBinding.ensureInitialized(); antes de llamar a funciones asincrónicas.


void main() async {
  WidgetsFlutterBinding.ensureInitialized();   //  ADD THIS BEFORE YOUR ASYNC FUNCTION CALL.
  await Firestore.instance.settings(...);      //  NOW YOU CAN CALL ASYNC FUNCTION.   
  ...
  runApp(
    ...
  )
Jesús Iniesta
fuente