为什么这个函数会阻塞flutter的ui?

FLUTTER:网络

你好,我想当我点击一个按钮时,下面的函数以非阻塞方式执行并且不会冻结 ui,问题是将它包装在 Future 中,它冻结了 ui,我甚至使用了 async_task 但它不起作用...

List<int> _compressFiles(List<Uint8List> data) {
   BZip2Encoder zec = BZip2Encoder();
   Archive archive = new Archive();
   for (var i = 0; i < data.length; i++) {
     archive.addFile(ArchiveFile(i.toString(),data[i].elementSizeInBytes,data[i]));
   }
   List<int> tar_data = TarEncoder().encode(archive);
   List<int> tar_bz2 = BZip2Encoder().encode(tar_data);
   return tar_bz2;
}

(此代码使用存档库 https://pub.dev/packages/archive)。

onpressed 函数:

onpressed: () { 
   //this freeze the ui for 3-4s
   List<Uint8List> l = [];
   for (var i in list) {
      l.add(i.image);
   }
   compressFiles(l).then(...);

}
Qwea521 回答:为什么这个函数会阻塞flutter的ui?

您可以尝试使您的函数异步,但您的 UI 可能会卡住。

它的工作原理是有一个事件循环,它循环通过事件队列和微任务队列来检查是否有需要处理的东西。如果有,它将在应用程序等待时处理它。这可能会导致 UI 在某些函数未完成返回时无响应。

在您的场景中,由于涉及压缩和编码,您应该使用 3rd 方插件或使用隔离从主隔离加载任务。

,

使用 async 关键字声明您的函数。

Future<List<int>> _compressFiles(List<Uint8List> data) async{}
本文链接:https://www.f2er.com/1008.html

大家都在问