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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:30