Flutter: eccezione non gestita: è stato eseguito l'accesso a ServicesBinding.defaultBinaryMessenger prima che l'associazione fosse inizializzata


134

Qualche soluzione per risolvere questo 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<>

metti questa riga come prima istruzione in main () - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Risposte:


312

Questo problema viene introdotto quando si aggiorna Flutter. Il motivo è che stai aspettando alcuni dati o eseguendo una asyncfunzione all'interno main().

Stavo inizializzando ScopedModeldentro main()e dentro che stavo aspettando alcuni dati.

C'è una piccola correzione. Corri WidgetsFlutterBinding.ensureInitialized()dentro void main(), prima di farlo runApp(). Funziona come un fascino !!

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(Delta(
    model: ProductDataModel(),
  ));
}

17
assicurati che WidgetFlutterBinding.ensureInitialized () sia la prima riga di main (). e poi procedi come al solito
Avnish kumar

10
Qual è il potenziale impatto negativo di questo? Tutte le applicazioni svolazzanti dovrebbero avere quella linea all'inizio del main()metodo?
user482594

3
Se stai usando il metodo asincrono in main (), devi aggiungere questo
Debasmita Sarkar

2
non funziona per interruzione v1.14.4 / v1.14.6 su var databasesPath = await getDatabasesPath ();
Ares91

70

Questo generalmente accade se stai aspettando il main()metodo. Quindi, la soluzione sarebbe:

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

  // rest of your app code
  runApp(
    MaterialApp(...),
  );
}

1
non funziona - si interrompe all'accesso (attendi getDatabasesPath (), 'mydb.db'),
live-love

25

Non sono sicuro di avere la risposta corretta, ma ho ricevuto lo stesso errore dopo un recente aggiornamento di flutter e sono riuscito a farlo funzionare, quindi condivido le mie scoperte.

Sembra che l'errore potrebbe essere causato da una recente modifica sostanziale : https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Di conseguenza, dobbiamo modificare manualmente il codice come segue:

  • Se stai eseguendo un'applicazione e devi accedere al messenger binario prima che runApp()sia stato chiamato (ad esempio, durante l'inizializzazione del plug-in), devi chiamare esplicitamente il WidgetsFlutterBinding.ensureInitialized()primo.
  • Se stai eseguendo un test, puoi chiamare TestWidgetsFlutterBinding.ensureInitialized()come prima riga nel main()metodo del test per inizializzare l'associazione.

In alternativa, se sei un principiante come me e hai difficoltà a capire quanto sopra e # 38464 , puoi temporaneamente evitare questo problema passando al canale beta. Esegui semplicemente "flutter channel beta". La modifica decisiva non è ancora nel canale beta, quindi dopo il passaggio al canale beta non riceverai questo errore almeno per ora.


Grazie fratello, ora ho appena usato la versione beta per evitare errori!
Sopheadavid Sopheap

11

basta aggiungere questa riga in main.dart

WidgetsFlutterBinding.ensureInitialized(); 

il tuo codice sembra

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

2

nel mio caso quando si usa l'orientamento,

prima risolto:

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

utilizzo risolto:

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

Il punto è aggiungere WidgetsFlutterBinding.ensureInitialized () nella prima riga della classe principale


2

Potresti imbatterti in questo se stai cercando di eseguire il codice nativo del plugin in un isolato. La documentazione di isol_handler qui spiega bene questo:

I plugin utilizzano un meccanismo chiamato canale della piattaforma per comunicare tra Dart e i lati nativi, un meccanismo di passaggio dei messaggi che utilizza il tipo MethodChannel. Questo meccanismo dipende dagli elementi del motore dell'interfaccia utente sottostante per funzionare.

Il problema qui è che gli isolati forniranno un aumento delle prestazioni solo nel caso di codice dardo costoso dal punto di vista computazionale. Il codice della piattaforma del plug-in utilizzerà nuovamente il thread principale (UI).

Anche la chiamata WidgetsFlutterBinding.ensureInitializedall'interno di un isolato avrà esito negativo a causa dell'assenza di un motore UI sottostante nell'isolato.


1

Prima avevo la versione v1.12.13+hotfix.5, poi sono passato alla versione v1.14.4e ha funzionato.

L'errore dice che dovresti aggiungere WidgetsFlutterBinding.ensureInitialized();, ma poiché non ha funzionato per me, sono passato all'altra versione. Una cosa da tenere a mente è che devi ancora aggiungere WidgetsFlutterBinding.ensureInitialized();come prima riga nel tuo main!


1

Soluzione: chiamare WidgetsFlutterBinding.ensureInitialized(); prima di chiamare funzioni asincrone.


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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.