flutter将assets资源解压到本地

2,258 阅读1分钟

首先添加以下依赖到pubspec.yaml

archive: ^2.0.13
path_provider: ^1.6.11

以下则是解压的方法。

/// 解压zip文件
Future<void> unzip() async {
  // 加载assets资源
  var ass = await rootBundle.load('assets/www.zip');
  // 获取2进制内容
  Uint8List bytes = ass.buffer.asUint8List();
  // 解压
  final archive = ZipDecoder().decodeBytes(bytes);
  var documents = await getApplicationDocumentsDirectory();
  // 设定要解压的目标文件夹
  var wwwRoot = documents.path + '/www';

  // 解压文件到磁盘
  for (final file in archive) {
    final filename = file.name;
    if (file.isFile) {
      final data = file.content as List<int>;
      File('$wwwRoot/$filename')
        ..createSync(recursive: true) // 同步创建文件
        ..writeAsBytesSync(data); // 将解压出来的文件内容写入到文件
    } else {
      Directory('$wwwRoot/$filename')
        ..create(recursive: true);
    }
  }
}

因为是直接将压缩包的二进制内容加载到内存,因此对于大文件可能会崩溃。具体多大,我也没测试。也因手机而异吧。