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

Flutter使用Where筛选API数据报错:WhereIterable无data属性

Flutter筛选员工列表报错排查与解决

错误原因

  • 类型混淆:personelResult初始被赋值为Personal类型的API解析结果,后续又被赋值为WhereIterable<Datum>(where方法的返回值)。WhereIterable类型没有data属性,后续访问personelResult.data时就会触发报错。
  • 逻辑无效:plist初始是空列表,直接对空列表执行where筛选得不到有效数据,应该基于API返回的真实员工列表(result.data)进行筛选。

解决方案

1. 拆分变量,明确类型

将存储原始API数据和筛选后列表的变量分开,避免类型冲突:

// 存储原始API返回的完整数据
Personal? originalPersonelData;
// 存储筛选后的员工列表
List<Datum> filteredPersonList = [];
final url = Uri.parse('https://reqres.in/api/users');
int? counter;

2. 修改数据获取与筛选逻辑

更新getPerson方法,基于API返回的真实数据做筛选,并正确更新状态:

Future getPerson() async {
  try {
    final response = await http.get(url);
    if (response.statusCode == 200) {
      var result = personalFromJson(response.body);
      if (mounted) {
        setState(() {
          originalPersonelData = result;
          counter = result.data.length;
          // 示例:筛选id为1的员工,转为List类型
          filteredPersonList = result.data.where((element) => element.id == 1).toList();
          // 如果要筛选名为George的员工,替换为下面的条件
          // filteredPersonList = result.data.where((element) => element.firstName == 'George').toList();
        });
      }
      return result;
    } else {
      print(response.statusCode);
    }
  } catch (e) {
    print(e.toString());
  }
}

3. 关键注意点

  • where方法返回的是Iterable类型,必须调用toList()转为List<Datum>,才能在UI组件(比如ListView)中正常使用。
  • 筛选条件要严格匹配数据模型的字段,比如筛选名字时用firstName(对应API中的first_name),避免字段名拼写错误。

内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:39:19