Flutter调用Pokedex接口获取数据出现Unexpected value错误怎么解决
问题排查与修复方案
导致Unexpected value报错的核心原因有3个:
- 第一:空安全适配错误。你生成的模型类中所有属性都用
required修饰,声明为非空类型,但fromJson方法里却写了如果对应字段为null就赋值null,非空类型不能接收null值,直接触发类型异常。 - 第二:
GridView.builder未设置itemCount参数,渲染时无法确定列表长度,会无限读取下标越界报错。 - 第三:
FutureBuilder没有判断接口返回异常的情况,即使请求解析出错也不会走异常分支,无法定位具体报错。
修复步骤
1. 修正模型类的空安全适配
把所有可能为null的属性改为可空类型,比如把int candyCount改成int? candyCount,List<Evolution>? nextEvolution,其他可能为空的字段同理,同时调整fromJson和构造方法的逻辑,示例修改如下:
// 修改Pokemon类的属性声明,可能为空的字段加? class Pokemon { Pokemon({ required this.id, required this.num, required this.name, required this.img, required this.type, required this.height, required this.weight, required this.candy, this.candyCount, // 可能为空改为可空 required this.egg, required this.spawnChance, required this.avgSpawns, required this.spawnTime, required this.multipliers, required this.weaknesses, this.nextEvolution, // 可能为空改为可空 this.prevEvolution, // 可能为空改为可空 }); int id; String num; String name; String img; List<String> type; String height; String weight; String candy; int? candyCount; // 可空 String egg; double spawnChance; double avgSpawns; String spawnTime; List<double> multipliers; List<String> weaknesses; List<Evolution>? nextEvolution; // 可空 List<Evolution>? prevEvolution; // 可空 // 其余fromJson和toJson逻辑对应调整即可,不用再赋值null给非空字段 }
2. 给GridView.builder添加itemCount参数
GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2), itemCount: gelenPokedex.data?.pokemon.length ?? 0, // 新增itemCount配置 itemBuilder: (context, index) { debugPrint("gelen değer :${gelenPokedex.data!.pokemon[index].name}"); return Text(gelenPokedex.data!.pokemon[index].name); });
3. 补充FutureBuilder的异常判断逻辑
FutureBuilder( future: gonderiGetir(), builder: (context, AsyncSnapshot<Pokedex> gelenPokedex) { if (gelenPokedex.connectionState == ConnectionState.waiting) { return Center( child: CircularProgressIndicator(), ); } // 新增异常判断分支 if (gelenPokedex.hasError) { return Center( child: Text("请求出错:${gelenPokedex.error.toString()}"), ); } if (gelenPokedex.hasData) { return GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2), itemCount: gelenPokedex.data?.pokemon.length ?? 0, itemBuilder: (context, index) { return Text(gelenPokedex.data!.pokemon[index].name); }); } else { return Center( child: Text("无数据"), ); } })
修改完以上三点即可正常请求解析接口数据。
内容的提问来源于stack exchange,提问作者Kubilay
相关产品推荐
相关产品推荐

