Flutter访问Model类内JSON嵌套列表出现有效值范围为空错误如何解决
错误原因
触发该错误的核心原因是代码访问了空列表的下标元素,结合你的代码场景,可细分为三类常见情况:
- 外层
snapshot.data列表为空:网络请求未完成、请求失败无异常处理、接口返回空列表时,直接用index访问第0个元素就会触发该报错。 - 内层
datalist列表为空:外层列表有数据,但单个Car对象的datalist字段为空,此时访问datalist[index]会触发报错,通常是接口返回对应字段为空、Bean类解析datalist失败导致默认赋值为空列表。 - 下标逻辑错误:两层列表共用同一个
index,比如外层列表长度为5,下标遍历到2,但对应Car对象的datalist长度只有1,用下标2访问datalist自然超出有效范围。
解决方案
- 新增渲染前的空值与状态兜底
列表渲染前先判断请求状态、外层列表是否为空、单个Car对象的datalist是否为空,避免直接访问下标:
Widget build(BuildContext context) { if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } if (snapshot.hasError || !snapshot.hasData || snapshot.data!.isEmpty) { return const Text('暂无车辆数据'); } return ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (context, index) { final currentCar = snapshot.data![index]; if (currentCar.datalist.isEmpty) { return const Text('当前车辆无相关数据'); } // 若仅需取datalist的第一个元素,直接用固定下标0,不要复用外层index return Text(currentCar.datalist[0].title ?? '无标题'); } ); }- 新增渲染前的空值与状态兜底
- 修正嵌套列表的下标逻辑
如果需求是遍历展示单个Car下所有datalist的内容,嵌套一层遍历即可,不要共用外层index:
itemBuilder: (context, index) { final currentCar = snapshot.data![index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: currentCar.datalist.map((dataItem) { return Text(dataItem.title ?? '无标题'); }).toList(), ); }- 修正嵌套列表的下标逻辑
- Bean解析层加空值兼容
解析datalist时增加空判断,避免解析失败返回null,同时可加日志定位解析问题:
factory Car.fromJson(Map<String, dynamic> json) { return Car( // 其余字段解析逻辑 datalist: (json['datalist'] as List?) ?.map((item) => DatalistItem.fromJson(item as Map<String, dynamic>)) .toList() ?? [], ); }- Bean解析层加空值兼容
- 网络请求层加异常捕获
getCars方法中捕获请求、解析异常,出现错误时主动抛出可识别的异常信息,避免静默返回空列表。
- 网络请求层加异常捕获
内容的提问来源于stack exchange,提问作者Joe26
相关产品推荐
相关产品推荐

