有解决这个问题的办法吗?

堆栈跟踪:

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

当前回答

不确定我是否有正确的答案,但在最近一次扑动升级后,我得到了同样的错误,并设法使其工作,所以我将分享我的发现。

看起来错误可能是由最近的破坏性更改引起的: https://groups.google.com/forum/ !味精/ flutter-announce / sHAL2fBtJ1Y / mGjrKH3dEwAJ。

因此,我们需要手动修改如下代码:

如果您正在运行一个应用程序,并且需要在调用runApp()之前访问二进制消息传递器(例如,在 插件初始化),然后需要显式调用 WidgetsFlutterBinding.ensureInitialized()。 如果您正在运行一个测试,您可以调用TestWidgetsFlutterBinding.ensureInitialized()作为中的第一行 测试的main()方法来初始化绑定。

或者,如果你是一个像我一样的新手,很难理解上面的内容和#38464,你可以通过切换到测试版来暂时避免这个问题。运行"颤振通道beta"突破性的更改还没有在beta通道中,所以在切换到beta通道后,至少现在不会得到这个错误。

其他回答

这可以使用WidgetsBinding.ensureInitialized()来解决,它建立了Dart层和平台之间的通信。

如果我们需要在调用[runApp]之前初始化绑定,就需要调用这个方法。除非绑定建立,否则颤振不能直接与颤振引擎相互作用。

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

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

ServicesBinding监听平台消息,并将它们定向到接收消息的处理程序(BinaryMessenger)。 PaintingBinding负责绑定到绘画库。 RenderBinding将渲染树绑定到Flutter引擎。 WidgetBinding将小部件树绑定到Flutter引擎。 SchedulerBinding是运行即时任务的调度器。 SemanticsBinding绑定语义层和Flutter引擎。 GestureBinding是手势子系统的绑定。

这些所有的绑定将作为一个胶水之间的Dart和平台。

如果你试图在一个独立的环境中执行插件原生代码,你可能会遇到这种情况。这里的isolate_handler文档很好地解释了这一点:

插件之间使用一种称为平台通道的机制进行通信 Dart和本机边,消息传递机制使用 MethodChannel类型。这种机制取决于元素 底层UI引擎的功能。

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

调用WidgetsFlutterBinding。隔离内部的ensureInitialized也会失败,因为隔离中缺少底层UI引擎。

不确定我是否有正确的答案,但在最近一次扑动升级后,我得到了同样的错误,并设法使其工作,所以我将分享我的发现。

看起来错误可能是由最近的破坏性更改引起的: https://groups.google.com/forum/ !味精/ flutter-announce / sHAL2fBtJ1Y / mGjrKH3dEwAJ。

因此,我们需要手动修改如下代码:

如果您正在运行一个应用程序,并且需要在调用runApp()之前访问二进制消息传递器(例如,在 插件初始化),然后需要显式调用 WidgetsFlutterBinding.ensureInitialized()。 如果您正在运行一个测试,您可以调用TestWidgetsFlutterBinding.ensureInitialized()作为中的第一行 测试的main()方法来初始化绑定。

或者,如果你是一个像我一样的新手,很难理解上面的内容和#38464,你可以通过切换到测试版来暂时避免这个问题。运行"颤振通道beta"突破性的更改还没有在beta通道中,所以在切换到beta通道后,至少现在不会得到这个错误。

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

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

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

在我的例子中,当使用方向时,

解决前:

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

解决用途:

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

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