Flutter:未处理的异常:初始化绑定之前已访问ServicesBinding.defaultBinaryMessenger

Sop*_*eap 19 flutter

有解决此问题的解决方案吗?

堆栈跟踪:

[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<…>
Run Code Online (Sandbox Code Playgroud)

Deb*_*kar 37

升级Flutter时会引入此问题。其背后的原因是您正在等待一些数据或在main()中运行异步函数。

我正在main()内初始化ScopedModel,并在其中等待一些数据。

有一个很小的修复程序。在运行runApp()之前,只需在void main()内运行WidgetsFlutterBinding.ensureInitialized()即可。奇迹般有效!!

void main() {
      WidgetsFlutterBinding.ensureInitialized();
      runApp(Delta(
        model: ProductDataModel(),
      ));
}
Run Code Online (Sandbox Code Playgroud)

  • 确保 WidgetFlutterBinding.ensureInitialized() 是 main() 的第一行。然后照常进行 (42认同)
  • 这有什么潜在的负面影响?所有 flutter 应用程序都应该在“main()”方法的开头包含该行吗? (16认同)
  • 如果你在 main() 中使用异步方法,你需要添加这个 (3认同)
  • 不适用于 v1.14.4/v1.14.6 var databasePath = wait getDatabasesPath(); 上的中断 (2认同)

Cop*_*oad 20

如果您正在等待main()方法,通常会发生这种情况。因此,解决方案将是:

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

  // rest of your app code
  runApp(
    MaterialApp(...),
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 不工作 - 在连接处中断(等待 getDatabasesPath(), 'mydb.db'), (2认同)

Saa*_*med 15

只需在 main.dart 中添加这一行

WidgetsFlutterBinding.ensureInitialized(); 
Run Code Online (Sandbox Code Playgroud)

你的代码看起来像

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


小智 13

不知道我的答案是否正确,但是最近一次升级后出现了相同的错误,并且设法使其正常工作,因此我将分享我的发现。

看来该错误可能是由最近的重大更改引起的:https : //groups.google.com/forum/# ! msg/flutter-announce/sHAL2fBtJ1Y/ mGjrKH3dEwAJ

因此,我们需要手动更改代码,如下所示:

  • 如果您正在运行应用程序,并且需要runApp()在调用二进制信使之前(例如,在插件初始化期间)访问二进制信使,则需要显式调用第 WidgetsFlutterBinding.ensureInitialized()一个。
  • 如果您正在运行测试,则可以TestWidgetsFlutterBinding.ensureInitialized()在测试main()方法的第一行调用,以初始化绑定。

另外,如果您是像我这样的新手,并且努力理解上述内容和#38464,则可以通过切换到Beta频道暂时避免此问题。只需运行“ flutter channel beta”。重大更改尚未出现在Beta通道中,因此切换到Beta通道后,至少暂时不会出现此错误。


小智 9

通过在里面添加这一行void main(),错误将得到解决。

WidgetsFlutterBinding.ensureInitialized();
Run Code Online (Sandbox Code Playgroud)


sjs*_*sam 8

如果您尝试在隔离中执行插件本机代码,您可能会遇到这种情况。这里的isolate_handler 文档很好地解释了这一点:

插件使用一种称为平台通道的机制在 Dart 和本机端之间进行通信,这是一种使用 MethodChannel 类型的消息传递机制。这种机制依赖于底层 UI 引擎的元素来运行。

这里的问题是,只有在计算成本高的 dart 代码的情况下,隔离才会提供性能提升。插件的平台代码将再次使用主(UI)线程。

WidgetsFlutterBinding.ensureInitialized由于隔离中缺少底层 UI 引擎,在隔离中调用也会失败。

  • 那么解决方法是什么? (2认同)

Jes*_*sta 7

解决方案:在调用异步函数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(
    ...
  )
Run Code Online (Sandbox Code Playgroud)


小智 6

就我而言,当使用方向时,

解决之前:

void main() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_).{
runApp(MyApp());
});
}
Run Code Online (Sandbox Code Playgroud)

解决使用:

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

重点是在主类第一行添加WidgetsFlutterBinding.ensureInitialized()


jit*_*555 6

这可以通过在和WidgetsBinding.ensureInitialized()之间建立通信来解决。Dart LayerPlatform

如果我们需要在调用 [runApp] 之前初始化绑定,我们需要调用此方法。除非建立绑定,否则 Flutter 无法直接与 Flutter 引擎交互。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();   
  /// Your Code which required binding
  runApp(
    ...
  )
}
Run Code Online (Sandbox Code Playgroud)

WidgetsFlutterBinding.ensureInitialized()支持各种绑定,例如

  1. ServicesBinding侦听平台消息并将其定向到传入消息的处理程序 (BinaryMessenger)。

  2. PaintingBinding负责绑定绘画库。

  3. RenderBinding将渲染树绑定到 Flutter 引擎。

  4. WidgetBinding将 widget 树绑定到 Flutter 引擎。

  5. SchedulerBinding是运行即时任务的调度程序。

  6. SemanticsBinding绑定语义层和Flutter引擎。

  7. GestureBinding是手势子系统的绑定。

这些所有绑定将充当 Dart 和 Platform 之间的粘合剂。