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

Answers:


310

升级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 '19

3
如果使用的是在main()异步方法,您需要添加此
Debasmita萨卡

2
无法在var database上针对v1.14.4 / v1.14.6中断工作Path = 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')处中断,
现场直播

25

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

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

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

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

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


谢谢兄弟,现在我只是使用Beta版,以避免出错!
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();main作为第一行添加!


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引擎的功能。

这里要注意的是,仅在计算开销较大的飞镖代码的情况下,隔离才会提高性能。插件的平台代码将再次使用main(UI)线程。

WidgetsFlutterBinding.ensureInitialized在隔离中调用也将失败,因为隔离中不存在底层的UI引擎。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.