You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter添加压缩代码后出现RangeError(index)问题求助

错误排查:RangeError (index): Invalid value: Not in inclusive range 0..1: 12

错误原因

  1. 数据源被非法修改:在onTap回调中,你直接将全局的files数组替换成仅含2个元素的新数组,但ListView.builder的itemCount绑定的是files.length。当原files数组长度大于2时(比如原长度为13,索引范围0-12),ListView仍会尝试渲染原长度对应的所有item,此时访问files[12]会超出新数组的索引范围(仅支持0-1),触发RangeError。
  2. 路径处理错误:你将单个文件路径传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:15:59