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(...);
}
答案 0 :(得分:0)
您可以尝试使您的函数异步,但您的 UI 可能会卡住。
它的工作原理是有一个事件循环,它循环通过事件队列和微任务队列来检查是否有需要处理的东西。如果有,它将在应用程序等待时处理它。这可能会导致 UI 在某些函数未完成返回时无响应。
在您的场景中,由于涉及压缩和编码,您应该使用 3rd 方插件或使用隔离从主隔离加载任务。
答案 1 :(得分:-1)
使用 async
关键字声明您的函数。
Future<List<int>> _compressFiles(List<Uint8List> data) async{}