You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:39:03