Dart代码出现Invalid value: Valid value range is empty:0报错求解决
问题解决:索引越界导致的"Invalid value: Valid value range is empty: 0"错误
错误原因
你遇到的错误并非是空值处理问题,而是索引越界:当Last30DayData.values.toList()的长度小于31时,循环中i超过列表最大索引,访问[i]就会触发这个报错。之前的两段代码只判断了Last30DayData是否为null,完全没考虑列表长度不足的情况。
修正方案
先安全获取数据列表,再循环时判断索引是否在有效范围内,超出或空值都用0填充:
方案1:普通循环写法
void _set() { List<int> _babus = []; // 链式空安全访问,避免深层null报错,默认空列表 List<dynamic> dataList = _consumptionData['Energies']?[0]?['EnergyInfo']?['Last30DayData']?.values.toList() ?? []; for (int i = 0; i < 31; i++) { // 索引有效且值不为null时取原值,否则用0 int value = (i < dataList.length && dataList[i] != null) ? dataList[i] as int : 0; _babus.add(value); } print(_babus); }
方案2:List.generate简洁写法
void _set() { List<dynamic> dataList = _consumptionData['Energies']?[0]?['EnergyInfo']?['Last30DayData']?.values.toList() ?? []; List<int> _babus = List.generate(31, (index) { return (index < dataList.length && dataList[index] != null) ? dataList[index] as int : 0; }); print(_babus); }
关键改进点
- 使用
?链式空安全访问,避免深层嵌套的null引用错误 - 循环时先判断索引是否在列表有效范围内,彻底解决索引越界问题
- 同时处理空值情况,确保空值也会被替换为0
内容的提问来源于stack exchange,提问作者ASCI
相关产品推荐
相关产品推荐

