Flutter: İşlenmeyen Özel Durum: ServicesBinding.defaultBinaryMessenger'a bağlama başlatılmadan önce erişildi


135

Bu sorunu çözmek için herhangi bir çözüm var mı?

Yığın izleme:

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

bu satırı main () içindeki ilk ifadeniz olarak koyun - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Yanıtlar:


316

Bu sorun, Flutter'ı yükselttiğinizde ortaya çıkıyor. Bunun arkasındaki sebep, bazı verileri beklemeniz veya asynciçeride bir işlev çalıştırmanızdır main().

Ben initialising edildi ScopedModeliçini main()bazı veriler için bekliyor olduğunu ve içini.

Çok küçük bir düzeltme var. Sen yapmadan önce WidgetsFlutterBinding.ensureInitialized()içeri koş . Tıkır tıkır çalışıyor!!void main()runApp()

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

17
WidgetFlutterBinding.ensureInitialized () 'in main ()' in ilk satırı olduğundan emin olun. ve sonra her zamanki gibi devam edin
Avnish kumar

10
Bunun potansiyel olumsuz etkisi nedir? Tüm flutter uygulamalarında main()yöntemin başlangıcında bu çizgi olmalı mı ?
user482594

3
Main () 'de eşzamansız yöntem kullanıyorsanız, bunu eklemeniz gerekir
Debasmita Sarkar

2
v1.14.4 / v1.14.6 için çalışmıyor var databasesPath = await getDatabasesPath ();
Ares91

70

Bu genellikle main()yöntemi bekliyorsanız olur . Yani çözüm şu şekilde olacaktır:

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

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

1
çalışmıyor - birleştirme sırasında molalar (getDatabasesPath (), 'mydb.db' bekliyoruz),
live-love

25

Doğru cevaba sahip olup olmadığımdan emin değilim, ancak yakın zamanda yapılan bir flutter yükseltmesinden sonra aynı hatayı aldım ve onu çalıştırmayı başardım, bu yüzden bulgularımı paylaşıyorum.

Görünüşe göre hatanın nedeni yakın zamanda yapılan bir değişiklik olabilir: https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Sonuç olarak, kodu aşağıdaki gibi manuel olarak değiştirmemiz gerekiyor:

  • Bir uygulama çalıştırıyorsanız ve runApp()çağrılmadan önce ikili mesajlaşma programına erişmeniz gerekiyorsa (örneğin, eklenti başlatma sırasında), o zaman WidgetsFlutterBinding.ensureInitialized()ilkini açıkça aramanız gerekir .
  • Bir test çalıştırıyorsanız , bağlamayı başlatmak TestWidgetsFlutterBinding.ensureInitialized()için test main()yönteminizin ilk satırı olarak çağırabilirsiniz .

Alternatif olarak, benim gibi yeni başlayan biriyseniz ve yukarıdakileri ve # 38464'ü anlamakta zorlanıyorsanız , beta kanalına geçerek bu sorunu geçici olarak önleyebilirsiniz. Sadece "flutter channel beta" yı çalıştırın. Son değişiklik henüz beta kanalında değil, bu yüzden beta kanalına geçtikten sonra bu hatayı en azından şimdilik almayacaksınız.


Teşekkürler kardeşim, şimdi hatayı önlemek için beta sürümünü kullandım!
Sopheadavid Sopheap

12

sadece main.dart'a bu satırı ekleyin

WidgetsFlutterBinding.ensureInitialized(); 

kodunuz gibi görünüyor

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

2

benim durumumda oryantasyonu kullanırken,

çözülmeden önce:

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

çözülmüş kullanım:

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

Önemli olan, ana sınıfın ilk satırına WidgetsFlutterBinding.ensureInitialized () eklemektir.


2

Bir izolatta eklenti yerel kodunu çalıştırmaya çalışıyorsanız bununla karşılaşabilirsiniz. İsolate_handler belgeleri burada bu işi iyi açıklıyor:

Eklentiler, Dart ve yerel taraflar arasında iletişim kurmak için platform kanalı adı verilen bir mekanizma kullanır; bu, MethodChannel türünü kullanan bir mesaj iletme mekanizmasıdır. Bu mekanizma, çalışacak temel UI motorunun öğelerine bağlıdır.

Buradaki nokta, izolatların yalnızca hesaplama açısından pahalı olan dart kodu durumunda bir performans artışı sağlayacağıdır. Eklentinin platform kodu tekrar ana (UI) iş parçacığını kullanacaktır.

WidgetsFlutterBinding.ensureInitializedİzolatın içinden arama , izolatta temelde yatan bir UI motorunun olmaması nedeniyle de başarısız olur.


1

Sürüme sahip olmadan önce sürüme v1.12.13+hotfix.5geçtim v1.14.4ve işe yaradı.

Hata eklemeniz gerektiğini söylüyor WidgetsFlutterBinding.ensureInitialized();, ancak bu benim için işe yaramadığından diğer sürüme geçtim. Yine de akılda tutulması gereken bir şey, yine de WidgetsFlutterBinding.ensureInitialized();ana satırınıza ilk satır olarak eklemeniz gerektiğidir!


1

Çözüm: Eşzamansız işlevleri çağırmadan WidgetsFlutterBinding.ensureInitialized(); önce arayın .


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.