如何在 dart 中异步提取 zip 文件存档?

Mar*_*ark 7 dart

我正在使用存档包来扩展 zip 文件,如下所示:

  final bytes = new File(zippedFile).readAsBytesSync();
  final archive = new ZipDecoder().decodeBytes(bytes);

  for (var file in archive) {
    final filename = '/Users/mark/blah/${file.name}';
    if (file.isFile) {
      var outFile = new File(filename);
      outFile = await outFile.create(recursive: true);
      await outFile.writeAsBytes(file.content);
    } else {
      await new Directory(filename)
          .create(recursive: true);
    }
  }
Run Code Online (Sandbox Code Playgroud)

问题是我在 Flutter 中的 UI 线程不时挂起,导致 CircularProgressIndicator 出现卡顿 - 我怀疑问题出在对 file.content 的调用上。如何在不阻塞 UI 线程的情况下调用它?我需要使用隔离吗?

Mar*_*ark -1

如果使用 Flutter,这里有一个基于 G\xc3\xbcnter Z\xc3\xb6chbauer\ 的评论的解决方案:

\n\n
  final bytes = new File(zippedFile).readAsBytesSync();\n  final archive = new ZipDecoder().decodeBytes(bytes);\n\n  for (var file in archive) {\n    final filename = \'/Users/mark/blah/${file.name}\';\n    if (file.isFile) {\n      final decompressed = await compute(decompressArchiveFile, file);\n      var outFile = new File(filename);\n      outFile = await outFile.create(recursive: true);\n      await outFile.writeAsBytes(decompressed);\n\n    } else {\n      await new Directory(filename)\n          .create(recursive: true);\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是函数decompressArchiveFile

\n\n
List<int> decompressArchiveFile(ArchiveFile file) {\n  return file.content;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这种方法可行,但速度大约是同步方法的 5 倍。

\n

  • 您没有将计算用于任何严肃的事情。 (4认同)