Flutter Web中Base64转图片打包Zip报错:Uint8List转InputStreamBase失败
解决Flutter Web中Base64转图片打包Zip的类型错误问题
问题原因
你遇到的Expected a value of type 'InputStreamBase', but got one of type 'NativeUint8List'错误,是因为直接将Uint8List强制转换为InputStreamBase类型导致的——两者属于不同的类型体系,无法直接强转。需要用archive包提供的流类来包装Uint8List,才能符合ArchiveFile.stream的参数要求。
修正后的代码
import 'dart:convert'; import 'dart:typed_data'; import 'dart:html' as html; import 'package:archive/archive.dart'; void zipBase64Images(List<String> listOfB64) { final encoder = ZipEncoder(); final archive = Archive(); for (int index = 0; index < listOfB64.length; index++) { // 解码Base64为Uint8List final Uint8List imageBytes = base64.decode(listOfB64[index]); // 用InputStream.fromUint8List将Uint8List包装成InputStreamBase实例 final inputStream = InputStream.fromUint8List(imageBytes); // 创建ArchiveFile,文件名添加索引避免重复覆盖 final archiveFile = ArchiveFile.stream( "image_$index.png", imageBytes.lengthInBytes, inputStream, ); archive.addFile(archiveFile); } // 压缩生成Zip文件的Uint8List final zipBytes = encoder.encode(archive, level: Deflate.BEST_COMPRESSION); if (zipBytes != null) { downloadZip("test.zip", zipBytes); } } void downloadZip(String filename, Uint8List bytes) { // Flutter Web中实现文件下载的标准方式 final blob = html.Blob([bytes]); final url = html.Url.createObjectUrlFromBlob(blob); final anchor = html.AnchorElement(href: url) ..setAttribute("download", filename) ..click(); html.Url.revokeObjectUrl(url); }
关键改动说明
- 类型转换修正:用
InputStream.fromUint8List(imageBytes)替代强制类型转换,将Uint8List包装成archive包要求的InputStreamBase子类实例。 - 文件名优化:循环中添加索引后缀,避免多个文件使用相同文件名导致Zip内文件被覆盖。
- 下载逻辑完善:补充了Flutter Web环境下的标准下载实现,确保生成的Zip能正确触发浏览器下载。
内容的提问来源于stack exchange,提问作者Gafts
相关产品推荐
相关产品推荐

