Flutter中使用where筛选员工数据报错:Personal类无where方法
问题:使用where筛选Flutter API返回的员工列表时触发异常
请求API返回状态码200,但在setState中触发异常,错误信息如下:
Class 'Personal' has no instance method 'where'. Receiver: Instance of 'Personal' Tried calling: where(Closure: (dynamic) => bool)
我的实现代码
final url = Uri.parse('https://reqres.in/api/users'); int? counter; var personelResult; Future getPerson() async { try { final response = await http.get(url); if (response.statusCode == 200) { var result = personalFromJson(response.body); if (mounted) { setState(() { counter = result.data.length; personelResult = result; personelResult= personelResult.where((element) => element.firstName == "George").toList(); }); } return result; } else { print(response.statusCode); } } catch (e) { print(e.toString()); } } @override void initState() { super.initState(); getPerson(); }
数据模型代码
// To parse this JSON data, do // // final personal = personalFromJson(jsonString); import 'dart:convert'; Personal personalFromJson(String str) => Personal.fromJson(json.decode(str)); String personalToJson(Personal data) => json.encode(data.toJson()); class Personal { Personal({ required this.page, required this.perPage, required this.total, required this.totalPages, required this.data, required this.support, }); int page; int perPage; int total; int totalPages; List<Datum> data; Support support; factory Personal.fromJson(Map<String, dynamic> json) => Personal( page: json["page"], perPage: json["per_page"], total: json["total"], totalPages: json["total_pages"], data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))), support: Support.fromJson(json["support"]), ); Map<String, dynamic> toJson() => { "page": page, "per_page": perPage, "total": total, "total_pages": totalPages, "data": List<dynamic>.from(data.map((x) => x.toJson())), "support": support.toJson(), }; } class Datum { Datum({ required this.id, required this.email, required this.firstName, required this.lastName, required this.avatar, }); int id; String email; String firstName; String lastName; String avatar; factory Datum.fromJson(Map<String, dynamic> json) => Datum( id: json["id"], email: json["email"], firstName: json["first_name"], lastName: json["last_name"], avatar: json["avatar"], ); Map<String, dynamic> toJson() => { "id": id, "email": email, "first_name": firstName, "last_name": lastName, "avatar": avatar, }; } class Support { Support({ required this.url, required this.text, }); String url; String text; factory Support.fromJson(Map<String, dynamic> json) => Support( url: json["url"], text: json["text"], ); Map<String, dynamic> toJson() => { "url": url, "text": text, }; }
解决方案
错误核心是你把Personal对象当成列表调用where方法了——Personal是包含分页信息、员工列表等数据的模型类,本身没有where方法。真正的员工列表是Personal类里的data属性(类型为List<Datum>),你需要对这个列表进行筛选。
修改setState中的代码:
setState(() { // 直接筛选data列表,得到名字为George的员工列表 personelResult = result.data.where((element) => element.firstName == "George").toList(); // 如果需要保留完整的Personal结构(比如分页信息),可以创建新的Personal对象替换data // personelResult = Personal( // page: result.page, // perPage: result.perPage, // total: result.total, // totalPages: result.totalPages, // data: result.data.where((e) => e.firstName == "George").toList(), // support: result.support, // ); // 更新counter为筛选后的数量 counter = personelResult.length; });
这样就能正确筛选出名字为George的员工,不会再触发where方法不存在的异常。
内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez
相关产品推荐
相关产品推荐

