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
相关产品推荐
相关产品推荐

