Flutter:未処理の例外:バインディングが初期化される前にServicesBinding.defaultBinaryMessengerにアクセスしました


133

この問題を解決する解決策はありますか?

スタックトレース:

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

この行をmain()の最初のステートメントとして置きます-WidgetsFlutterBinding.ensureInitialized();
Vijay Ram

回答:


309

この問題は、Flutterをアップグレードすると発生します。この背後にある理由は、いくつかのデータを待っているか、async内部で関数を実行しているためmain()です。

私はいくつかのデータを待っている間、ScopedModel内部main()と内部を初期化していました。

非常に小さな修正があります。実行する前WidgetsFlutterBinding.ensureInitialized()void main()、内部で実行してくださいrunApp()。魅力のように動作します!!

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

17
WidgetFlutterBinding.ensureInitialized()がmain()の最初の行であることを確認してください。その後、通常どおり続行します
Avnish kumar

10
これの潜在的な悪影響は何ですか?すべてのフラッターアプリケーションは、main()メソッドの最初にその行を含める必要がありますか?
user482594

3
main()で非同期メソッドを使用している場合、これを追加する必要があります
Debasmita Sarkar

2
var databasesPathでv1.14.4 / v1.14.6のブレークが機能しない= await getDatabasesPath();
Ares91

69

これは通常、main()メソッドを待機している場合に発生します。したがって、解決策は次のようになります。

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

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

1
機能していません-join(await getDatabasesPath()、 'mydb.db')で中断します
live-love

25

正解かどうかはわかりませんが、最近のフラッターアップグレード後に同じエラーが発生し、なんとか動作するようになったので、調査結果を共有します。

エラーは最近の重大な変更が原因である可能性があるようです:https : //groups.google.com/forum/#!msg / flutter-announce / sHAL2fBtJ1Y / mGjrKH3dEwAJ

そのため、次のようにコードを手動で変更する必要があります。

  • アプリケーションを実行しrunApp()ていて、呼び出される前に(たとえば、プラグインの初期化中に)バイナリメッセンジャーにアクセスする必要がある場合は、WidgetsFlutterBinding.ensureInitialized()最初の呼び出しを明示的に呼び出す必要があります 。
  • テストを実行している場合TestWidgetsFlutterBinding.ensureInitialized()は、テストのmain()メソッドの最初の行としてを呼び出して、バインディングを初期化できます。

または、私のような初心者で、上記と#38464を理解するのに苦労している場合は、ベータチャネルに切り替えることで、この問題を一時的に回避できます。「フラッターチャネルベータ」を実行するだけです。重大な変更はまだベータチャネルにはないため、ベータチャネルに切り替えた後は、少なくとも今のところこのエラーは発生しません。


仲間に感謝します、今私はエラーを避けるためにベータ版を使用しました!
Sopheadavid Sopheap

11

main.dartにこの行を追加するだけです

WidgetsFlutterBinding.ensureInitialized(); 

あなたのコードは

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

2

私の場合、オリエンテーションを使用するとき、

解決前:

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

解決された使用:

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

ポイントは、メインクラスの最初の行にWidgetsFlutterBinding.ensureInitialized()を追加することです


1

バージョンを入手する前に、バージョンv1.12.13+hotfix.5に切り替えv1.14.4て機能しました。

エラーには、を追加する必要があると表示されていますWidgetsFlutterBinding.ensureInitialized();が、それが機能しなかったため、他のバージョンに切り替えました。ただしWidgetsFlutterBinding.ensureInitialized();、メインの最初の行として追加する必要があることに注意してください。


1

解決策:非同期関数を呼び出すWidgetsFlutterBinding.ensureInitialized(); 前に呼び出します。


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

1

プラグインのネイティブコードをアイソレートで実行しようとすると、これに遭遇する可能性があります。isolate_handlerのドキュメントここでは、このほかについて説明します。

プラグインは、プラットフォームチャネルと呼ばれるメカニズムを使用して、Dartとネイティブサイドの間で通信します。これは、MethodChannelタイプを使用したメッセージ受け渡しメカニズムです。このメカニズムは、機能する基本的なUIエンジンの要素に依存します。

ここでの問題点は、分離がパフォーマンスの向上をもたらすのは、計算量の多いDARTコードの場合のみであることです。プラグインのプラットフォームコードは再びmain(UI)スレッドを使用します。

WidgetsFlutterBinding.ensureInitialized分離内に基になるUIエンジンがないため、分離内での呼び出しも失敗します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.