Flutter开发测验App出现RangeError(index)空索引报错如何解决?
问题原因
你出现RangeError (index): Invalid value: Valid value range is empty: 0报错的核心原因是:
- 初始化时
groupValue是空列表,接口返回题目数据后,你直接通过索引访问groupValue[index]读取对应题目的选中值,此时groupValue长度和题目数量不匹配,触发索引越界 - 你之前设置默认值能解决问题,本质就是给
groupValue填充了和题目数量匹配的元素,避免了空数组访问索引的问题
解决方法(无需设置选项默认选中)
你不需要给选项设置默认选中值,只需要保证groupValue的长度和题目数量匹配,且支持未选中状态即可,修改步骤如下:
1. 修改groupValue的类型定义
将原来的非空int列表改为可空int列表,用来存储未选中状态的null值:
// 原代码:List<int> groupValue = []; // 修改为: List<int?> groupValue = [];
2. 拿到接口数据后先初始化groupValue
在FutureBuilder判断snapshot.hasData之后,新增初始化groupValue的逻辑,保证数组长度和题目数量一致,初始值全部设为null(代表未选中任何选项):
if (snapshot.hasData) { List<Result> list = snapshot.data.result; // 新增以下代码,仅在groupValue为空时初始化,避免build时重复重置选中状态 if (groupValue.isEmpty) { groupValue = List.generate(list.length, (index) => null); } // 保留你原来的ListView.builder代码即可 }
3. 修正提交按钮的越界问题(必须修改)
你原代码中提交按钮的index等于list.length,直接访问groupValue[index]会再次触发越界,如果你要提交所有题目的答案,直接传入groupValue即可:
// 原代码:saveAnswer(questionId, groupValue[index]); // 修改为提交所有题的答案,或者根据你的业务逻辑调整参数 onPressed: () { saveAnswer(questionId, groupValue); },
效果说明
Radio组件在groupValue为null或者和当前Radio的value不匹配时,会自动显示未选中状态,完全满足你不设置默认选中值的需求,同时也解决了索引越界的报错。
内容的提问来源于stack exchange,提问作者fatin
相关产品推荐
相关产品推荐

