Flutter Fetch API报错求助:索引越界与类型不匹配问题
问题修复方案
1. 解决RangeError(index)错误
该错误是由于你尝试访问列表中不存在的索引(比如索引1,但items列表长度仅为1),或是错误使用固定索引而非遍历所有地址项导致的。
正确处理方式:
- 遍历所有地址项:如果需要获取全部地址,不要用固定索引,直接遍历
items集合:
// 假设接口返回数据已解析为Map<String, dynamic> List<dynamic> addressItems = response.data['items']; for (var item in addressItems) { String shipto = item['shipto']; String address = item['address']; print('shipto: $shipto, 地址: $address'); }
- 按shipto值筛选地址:如果需要指定shipto对应的地址,用条件筛选而非索引定位:
// 获取shipto为"1"的地址 var targetAddress = addressItems.firstWhere( (item) => item['shipto'] == "1", orElse: () => null, ); if (targetAddress != null) { print(targetAddress['address']); }
2. 解决type 'string' is not a subtype of type 'int' of 'index'错误
这个错误是因为你把字符串类型的shipto值当作列表索引使用(列表索引必须是int类型),比如写了items["1"],但列表仅支持items[1]这类int索引。
正确处理方式:
- 优先用上面的
firstWhere筛选方法匹配shipto值,不要将shipto当作索引使用 - 如果确实需要将数字格式的shipto字符串转成索引,先做类型转换并校验有效性:
String shiptoStr = "1"; int shiptoIndex = int.parse(shiptoStr); // 先判断索引是否在列表有效范围内 if (shiptoIndex >= 0 && shiptoIndex < addressItems.length) { var address = addressItems[shiptoIndex]['address']; } else { print('无效的shipto索引'); }
额外注意事项
- 确认接口返回的
items是数组类型,而非单个对象。如果items是单个对象,列表长度为1,自然只能访问索引0 - 处理数据前先判断
items是否为空,避免空指针错误:
if (addressItems.isNotEmpty) { // 处理地址数据 } else { print('没有地址数据'); }
内容的提问来源于stack exchange,提问作者Ppnncs
相关产品推荐
相关产品推荐

