- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Flutter 的新手,所以问题可能有点明显,但我在互联网上找不到任何答案。
我有一个带有一些屏幕的 Flutter 应用程序,我会说在第五个屏幕上我有一个按钮,它应该触发一些繁重的计算工作(转换数千个图像)。在同一个屏幕上有一个进度条,它应该显示进度。
我很困惑如何从技术上实现它。触发显然发生在 onPressed
上按钮。
Future<void>
函数,然后 UI 在处理时完全卡住,这显然不是期望的行为compute
里面, 在第一个 await
我得到异常(exception) Unhandled Exception: 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.
这让我很困惑,因为我调用WidgetsFlutterBinding.ensureInitialized()
之前runApp()
.反正这个方法不管用。compute(computationFunction, 'argument');
// ...
static void computationFunction(String argument) async {
await firstStepFunction();
// ...
Isolate.spawn
我得到异常 Unhandled Exception: Invalid argument(s): Isolate.spawn expects to be passed a static or top-level function
这也让我感到困惑。我试图使功能 static
并将该功能移至第五个屏幕模块的顶层。没有改变。我应该启动 Isolate
吗?在 main
功能?在所有漂亮的例子中都是这样做的。我不能启动 Isolate
吗?在中间点击按钮。Isolate.spawn(computationFunction, receivePort.sendPort);
// ...
void computationFunction(SendPort sendPort) async {
await firstStepFunction();
// ...
在 Java 中,我认为一个简单的 new Thread(...).start()
将完成这项工作。
但是在 Flutter 中如何实现呢?
更新:
在我的实验中,我注意到,无论是 Flutter 热重启还是热重载都不能正确处理 isolates。您真的需要再次运行整个应用程序。
我设法开始了 Isolate.spawn
好吧如果async
/await
关键字被删除。当然,被调用的函数应该有它的同步版本。所以这并不是普遍适用的。
Isolate.spawn(computationFunction, receivePort.sendPort);
// ...
static void computationFunction(SendPort sendPort) { // async removed
firstStepFunctionSync(); // the function is replaced with its synchronous version
// ...
我找到包 flutter_isolate
允许运行异步函数:
FlutterIsolate.spawn(computationFunction, argument);
// ...
void computationFunction(SendPort sendPort) async {
await firstStepFunction();
// ...
我会尝试使用 flutter_isolate
在我的原型(prototype)中打包。
最佳答案
你应该阅读 https://dev.to/alphamikle/why-should-you-use-isolates-in-flutter-1k5o ,然后查看 package:isolates。
本文对比了使用主线程、计算、隔离本身和隔离包,以及各自的优点和缺点。很长一段时间以来我看到的最好的文章。
另外请记住,Java 线程是数据共享的,这可能会导致死锁。 Dart isolate 是无共享的,使用“端口”在 isolate 之间小心地移动数据,并且不需要锁定!
关于multithreading - Flutter 哪里可以定义Isolate?如何在 Flutter 中启动一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66665685/
我是一名优秀的程序员,十分优秀!