【问题标题】:Why does this function block flutter's ui?为什么这个功能会阻塞flutter的ui?
【发布时间】:2021-08-01 18:11:59
【问题描述】:

颤振:网络

你好,我想当我点击一个按钮时,下面的函数以非阻塞方式执行并且它不会冻结 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(...);

}

【问题讨论】:

标签: flutter dart


【解决方案1】:

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

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

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

【讨论】:

  • 我已经尝试过 Isolate,但是 js 太乱了...我会尝试做一个 js 互操作并将工作交给服务人员...
【解决方案2】:

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

Future<List<int>> _compressFiles(List<Uint8List> data) async{}

【讨论】:

  • 仅仅添加 async 关键字不会使同步函数异步。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2020-01-29
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多