Flutter添加压缩代码后出现RangeError(index)问题求助
错误排查:RangeError (index): Invalid value: Not in inclusive range 0..1: 12
错误原因
- 数据源被非法修改:在
onTap回调中,你直接将全局的files数组替换成仅含2个元素的新数组,但ListView.builder的itemCount绑定的是files.length。当原files数组长度大于2时(比如原长度为13,索引范围0-12),ListView仍会尝试渲染原长度对应的所有item,此时访问files[12]会超出新数组的索引范围(仅支持0-1),触发RangeError。 - 路径处理错误:你将单个文件路径传入
Directory构造函数创建sourceDir,这是无效的(Directory需要传入文件夹路径而非文件路径);同时路径拼接逻辑错误,sourceDir.path + files[index].path会生成重复路径,导致文件对象无效。
解决方法
1. 避免修改原数据源
创建临时数组存放待压缩文件,不要直接覆盖原files数组,防止破坏ListView的渲染数据源。
2. 修正路径逻辑
通过文件的parent属性获取父目录作为压缩的sourceDir,避免手动拼接路径出错。
3. 优化压缩逻辑
如果仅需压缩当前点击的单个文件,无需重复添加两次相同文件。
修改后的onTap代码示例:
onTap: () { // 获取当前点击的文件 final currentFile = files[index]; // 获取文件所在的父目录作为sourceDir final sourceDir = currentFile.parent; // 创建临时数组存放待压缩的文件(这里仅当前文件) final filesToZip = [currentFile]; // 确保压缩目录存在 final zipDir = Directory("storage/emulated/0/zip"); if (!zipDir.existsSync()) { zipDir.createSync(recursive: true); } final zipFile = File("${zipDir.path}/${currentFile.path.split('/').last}.zip"); try { ZipFile.createFromFiles( sourceDir: sourceDir, files: filesToZip, zipFile: zipFile); } catch (e) { print(e); } },
额外说明
如果需要压缩多个文件,只需往filesToZip数组中添加对应文件对象即可,全程不要修改原files数组,保证ListView的数据源稳定。
内容的提问来源于stack exchange,提问作者Faizan Abbas Bangash
相关产品推荐
相关产品推荐

