Multithreading 颤振中何处可以定义隔离?如何在flatter中启动线程?
我是一个新手,所以这个问题可能有点明显,但我在互联网上找不到任何答案 我有一个带有一些屏幕的颤振应用程序,我会说在第五个屏幕上有一个按钮,它会触发一些繁重的计算工作(转换数千张图像)。在同一屏幕上有一个进度条,它应该显示进度 我对如何在技术上实现这一点感到困惑。在按下按钮时,触发明显发生Multithreading 颤振中何处可以定义隔离?如何在flatter中启动线程?,multithreading,flutter,dart-isolates,Multithreading,Flutter,Dart Isolates,我是一个新手,所以这个问题可能有点明显,但我在互联网上找不到任何答案 我有一个带有一些屏幕的颤振应用程序,我会说在第五个屏幕上有一个按钮,它会触发一些繁重的计算工作(转换数千张图像)。在同一屏幕上有一个进度条,它应该显示进度 我对如何在技术上实现这一点感到困惑。在按下按钮时,触发明显发生 如果我只是调用一个Future函数,那么UI在处理过程中会完全冻结,这显然不是期望的行为 如果我把我的函数放在里面,在第一次wait时,我会得到异常 未处理的异常:异常:在初始化绑定之前访问了Services
- 如果我只是调用一个
函数,那么UI在处理过程中会完全冻结,这显然不是期望的行为Future
- 如果我把我的函数放在里面,在第一次
时,我会得到异常wait
这让我很困惑,因为我调用了未处理的异常:异常:在初始化绑定之前访问了ServicesBinding.defaultBinaryMessenger。如果您正在运行应用程序,并且需要在调用runApp()之前访问二进制messenger(例如,在插件初始化期间),那么您需要先显式调用WidgetsFlutterBinding.ensureInitialized()。
在WidgetsFlutterBinding.ensureInitialized()
。无论如何,这种方法不起作用runApp()之前
compute(计算函数,“参数”);
// ...
静态函数(字符串参数)异步{
等待第一步函数();
// ...
- 如果我将函数放入,我会得到异常
未处理的异常:无效参数:Isolate.spawn希望传递一个静态或顶级函数,这也让我感到困惑。我试图使函数
,并将函数移动到第五个屏幕模块的顶层。没有任何更改。我应该在静态
函数启动主
吗?在所有漂亮的示例中都是这样是这样做的。我不能在按钮中间点击“<代码>隔离>代码>。Isolate
新线程(…).start()
就可以完成这项工作
但如何在颤振中做到这一点
更新: 在我的实验中我注意到,无论是颤振热重启还是热重新加载都不能正确使用隔离。你真的需要重新运行整个应用程序 我成功地启动了
隔离。如果异步
/等待
关键字被删除,则生成
很好。当然,调用的函数应该有它的同步版本。因此,这不是通用的
隔离.spawn(计算函数,receivePort.sendPort);
// ...
静态void计算函数(SendPort SendPort){//async已删除
firstStepFunctionSync();//该函数将替换为其同步版本
// ...
我找到了允许运行异步函数的包:
spawn.spawn(计算函数、参数);
// ...
void计算函数(发送端口发送端口)异步{
等待第一步函数();
// ...
我将尝试在我的原型中使用flatter\u isolation
包。您应该阅读并查看包:isolations
这篇文章对比了使用主线程、compute、Isolate-proper和isolates包,以及它们各自的优缺点。这是我很久以来看到的最好的文章
还请记住,Java线程是数据共享的,这可能导致死锁。Dart隔离不共享任何内容,使用“端口”在隔离之间小心地移动数据,不需要锁定