Flutter: Unhandled Exception: ServicesBinding.defaultBinaryMessenger diakses sebelum pengikatan diinisialisasi


134

Ada solusi untuk mengatasi masalah ini?

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<>

letakkan baris ini sebagai pernyataan pertama Anda di main () - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Jawaban:


312

Masalah ini muncul saat Anda mengupgrade Flutter. Alasan di balik ini adalah Anda menunggu beberapa data atau menjalankan asyncfungsi di dalamnya main().

Saya sedang memulai ScopedModeldi dalam main()dan di dalam yang saya sedang menunggu beberapa data.

Ada perbaikan yang sangat kecil. Jalankan saja ke WidgetsFlutterBinding.ensureInitialized()dalam void main(), sebelum Anda melakukannya runApp(). Bekerja seperti pesona !!

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

17
pastikan WidgetFlutterBinding.ensureInitialized () adalah baris pertama main (). dan kemudian lanjutkan seperti biasa
Avnish kumar

10
Apa potensi dampak negatifnya? Haruskah semua aplikasi flutter memiliki baris tersebut di awal main()metode?
pengguna482594

3
Jika Anda menggunakan metode async di main (), Anda perlu menambahkan ini
Debasmita Sarkar

2
tidak berfungsi untuk kerusakan v1.14.4 / v1.14.6 pada var databasesPath = menunggu getDatabasesPath ();
Ares91

70

Ini biasanya terjadi jika Anda menunggu main()metode. Jadi, solusinya adalah:

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

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

1
tidak bekerja - istirahat saat bergabung (tunggu getDatabasesPath (), 'mydb.db'),
live-love

25

Tidak yakin apakah saya memiliki jawaban yang benar, tetapi saya mendapatkan kesalahan yang sama setelah peningkatan flutter baru-baru ini, dan berhasil membuatnya berfungsi, jadi saya membagikan temuan saya.

Sepertinya kesalahan ini mungkin disebabkan oleh perubahan yang dapat menyebabkan gangguan baru-baru ini: https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Akibatnya, kita perlu mengubah kode secara manual sebagai berikut:

  • Jika Anda menjalankan aplikasi dan perlu mengakses utusan biner sebelum runApp()dipanggil (misalnya, selama inisialisasi plugin), maka Anda perlu secara eksplisit memanggil yang WidgetsFlutterBinding.ensureInitialized()pertama.
  • Jika Anda menjalankan pengujian, Anda dapat memanggil TestWidgetsFlutterBinding.ensureInitialized()sebagai baris pertama dalam main()metode pengujian Anda untuk menginisialisasi pengikatan.

Atau, jika Anda seorang pemula seperti saya dan berjuang untuk memahami hal di atas dan # 38464 , Anda dapat menghindari masalah ini untuk sementara dengan beralih ke saluran beta. Jalankan saja "flutter channel beta". Perubahan yang merusak belum ada di saluran beta, jadi setelah beralih ke saluran beta Anda tidak akan mendapatkan kesalahan ini setidaknya untuk saat ini.


Terima kasih bro, sekarang saya baru saja menggunakan versi beta untuk menghindari error!
Sopheadavid Sopheap

11

tambahkan saja baris ini di main.dart

WidgetsFlutterBinding.ensureInitialized(); 

kode Anda sepertinya

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

2

dalam kasus saya saat menggunakan orientasi,

sebelum diselesaikan:

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

penggunaan terpecahkan:

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

Intinya adalah menambahkan WidgetsFlutterBinding.ensureInitialized () di baris pertama kelas utama


2

Anda dapat mengalami ini jika Anda mencoba menjalankan kode asli plugin secara terpisah. Dokumentasi isolate_handler di sini menjelaskan hal ini dengan baik:

Plugin menggunakan mekanisme yang disebut saluran platform untuk berkomunikasi antara Dart dan sisi asli, mekanisme penyampaian pesan menggunakan tipe MethodChannel. Mekanisme ini bergantung pada elemen mesin UI yang mendasari berfungsi.

Tangkapan di sini adalah bahwa isolat akan memberikan peningkatan kinerja hanya dalam kasus kode panah yang mahal secara komputasi. Kode platform plugin akan kembali menggunakan utas utama (UI) lagi.

Memanggil WidgetsFlutterBinding.ensureInitializeddi dalam isolate juga akan gagal karena tidak adanya mesin UI yang mendasari di isolate.


1

Sebelum saya memiliki versinya v1.12.13+hotfix.5, lalu saya beralih ke versi v1.14.4dan berhasil.

Kesalahan mengatakan bahwa Anda harus menambahkan WidgetsFlutterBinding.ensureInitialized();, tetapi karena itu tidak berhasil untuk saya, saya beralih ke versi lain. Satu hal yang perlu diingat adalah Anda masih harus menambahkan WidgetsFlutterBinding.ensureInitialized();sebagai baris pertama di utama Anda!


1

Solusi: Panggil WidgetsFlutterBinding.ensureInitialized(); sebelum memanggil fungsi asynchronous.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.