gpt4 book ai didi

multithreading - Flutter 哪里可以定义Isolate?如何在 Flutter 中启动一个线程?

转载 作者:行者123 更新时间:2023-12-05 03:43:41 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com