Flattern: Nicht behandelt Ausnahme: Auf ServicesBinding.defaultBinaryMessenger wurde zugegriffen, bevor die Bindung initialisiert wurde

133

Irgendeine Lösung, um dieses Problem zu lösen?

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<>
Sopheadavid Sopheap
quelle
Fügen Sie diese Zeile als erste Anweisung in main () ein - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Antworten:

307

Dieses Problem tritt auf, wenn Sie Flutter aktualisieren. Der Grund dafür ist, dass Sie auf Daten warten oder eine asyncFunktion ausführen main().

Ich initialisierte ScopedModelinnen main()und innen, dass ich auf einige Daten wartete.

Es gibt eine sehr kleine Lösung. Lauf einfach WidgetsFlutterBinding.ensureInitialized()hinein void main(), bevor du es tust runApp(). Klappt wunderbar!!

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(Delta(
    model: ProductDataModel(),
  ));
}
Debasmita Sarkar
quelle
17
Stellen Sie sicher, dass WidgetFlutterBinding.ensureInitialized () die erste Zeile von main () ist. und dann wie gewohnt vorgehen
Avnish Kumar
10
Was sind die möglichen negativen Auswirkungen davon? Sollten alle Flatteranwendungen diese Linie am Anfang der main()Methode haben?
user482594
3
Wenn Sie die asynchrone Methode in main () verwenden, müssen Sie diese hinzufügen
Debasmita Sarkar
2
funktioniert nicht für v1.14.4 / v1.14.6 break auf var database.ath = warte auf getDatabasesPath ();
Ares91
69

Dies geschieht im Allgemeinen, wenn Sie auf eine main()Methode warten . Die Lösung wäre also:

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

  // rest of your app code
  runApp(
    MaterialApp(...),
  );
}
CopsOnRoad
quelle
1
funktioniert nicht - Pausen beim Beitritt (warten auf getDatabasesPath (), 'mydb.db'),
Live-Love
25

Ich bin mir nicht sicher, ob ich die richtige Antwort habe, aber ich habe nach einem kürzlich durchgeführten Flatter-Upgrade den gleichen Fehler erhalten und es geschafft, ihn zum Laufen zu bringen. Daher teile ich meine Ergebnisse.

Es sieht so aus, als ob der Fehler durch eine kürzlich vorgenommene Änderung verursacht wurde: https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Daher müssen wir den Code wie folgt manuell ändern:

  • Wenn Sie eine Anwendung ausführen und auf den Binär-Messenger zugreifen müssen, bevor runApp()dieser aufgerufen wurde (z. B. während der Plugin-Initialisierung), müssen Sie den explizit aufrufen WidgetsFlutterBinding.ensureInitialized() ersten .
  • Wenn Sie einen Test ausführen, können Sie TestWidgetsFlutterBinding.ensureInitialized()die erste Zeile in der Testmethode aufrufen main(), um die Bindung zu initialisieren.

Wenn Sie ein Neuling wie ich sind und Schwierigkeiten haben, das oben Genannte und # 38464 zu verstehen , können Sie dieses Problem vorübergehend vermeiden, indem Sie zum Beta-Kanal wechseln. Führen Sie einfach "Flutter Channel Beta" aus. Die aktuelle Änderung befindet sich noch nicht im Beta-Kanal. Nach dem Wechsel zum Beta-Kanal wird dieser Fehler zumindest vorerst nicht angezeigt.

Mars
quelle
Danke Bruder, jetzt habe ich gerade die Beta-Version verwendet, um Fehler zu vermeiden!
Sopheadavid Sopheap
11

Fügen Sie einfach diese Zeile in main.dart hinzu

WidgetsFlutterBinding.ensureInitialized(); 

Ihr Code scheint wie

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

in meinem Fall bei der Verwendung von Orientierung,

vorher gelöst:

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

gelöste Verwendung:

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

Der Punkt ist, WidgetsFlutterBinding.ensureInitialized () in die erste Zeile der Hauptklasse einzufügen

Arjava
quelle
1

Bevor ich die Version hatte v1.12.13+hotfix.5, wechselte ich zur Version v1.14.4und es funktionierte.

Der Fehler besagt, dass Sie hinzufügen sollten WidgetsFlutterBinding.ensureInitialized();, aber da das bei mir nicht funktioniert hat, habe ich auf die andere Version gewechselt. Eine Sache zu beachten ist jedoch, dass Sie immer noch WidgetsFlutterBinding.ensureInitialized();als allererste Zeile in Ihrem Haupt hinzufügen müssen !

hanslissi
quelle
1

Lösung: Rufen Sie auf, WidgetsFlutterBinding.ensureInitialized(); bevor Sie asynchrone Funktionen aufrufen.


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

Sie könnten darauf stoßen, wenn Sie versuchen, nativen Plugin-Code in einem Isolat auszuführen. Die isolate_handler-Dokumentation hier erklärt dies gut:

Plugins verwenden einen Mechanismus namens Plattformkanal für die Kommunikation zwischen der Dart- und der nativen Seite, einen Mechanismus zur Nachrichtenübermittlung unter Verwendung des MethodChannel-Typs. Dieser Mechanismus hängt davon ab, ob Elemente der zugrunde liegenden UI-Engine funktionieren.

Der Haken dabei ist, dass Isolate nur bei rechenintensivem Dartcode eine Leistungssteigerung bewirken. Der Plattformcode des Plugins verwendet wieder den Hauptthread (UI).

Das Aufrufen WidgetsFlutterBinding.ensureInitializedeines Isolats schlägt ebenfalls fehl, da im Isolat keine zugrunde liegende UI-Engine vorhanden ist.

sjsam
quelle