【问题标题】:API How to filter item in Flutter? [duplicate]API如何在Flutter中过滤项目? [复制]
【发布时间】:2023-02-15 18:50:55
【问题描述】:

来自 API 的响应:

"loan": [
    {
        "id": "612",
        "icbsid": "55",
        "loanId": "null",
        "loanAcctNo": "001-063-06881-1",
        "productId": "4",
        "productName": "Fixed Principal+Int(Adv Pym)",
        "approvedDate": "2017-11-13",
        "loanAmount": "7359.97",
        "loanBalance": "0.0",
        "monthsToPay": "36",
        "interestRate": "12.0",
        "dueDate": "2020-12-13",
        "status": "Closed",
        "lastPayment": "2020-01-10"
    },
    {
        "id": "4970",
        "icbsid": "55",
        "loanId": "16",
        "loanAcctNo": "001-263-01625-4",
        "productId": "6",
        "productName": "Regular Long Term",
        "approvedDate": "2022-01-27",
        "loanAmount": "9934.21",
        "loanBalance": "5384.21",
        "monthsToPay": "60",
        "interestRate": "0.0",
        "dueDate": "2027-08-25",
        "status": "Disbursed",
        "lastPayment": "2022-12-29"
    }
]

这是我的代码,它工作正常,但我需要过滤 status

` @override Future<List?> fetchLoanList() async {

final response = await httpServices.getRequest('mobileAppGetIcbsid?icbsid=001-0000055');
final jsonData = json.decode(response.data);
var map = Map<String, dynamic>.from(jsonData);
var userData = UserModel.fromJson(map);

// userData.loan?.where((element) => element.status == "Closed"); <-- not working for me

return userData.loan;

}`

我试图取消注释此代码 userData.loan?.where((element) =&gt; element.status == "Closed"); 它可以正常显示数据但不能过滤状态。我希望只显示状态 == 'Closed' 的数据

【问题讨论】:

  • Dart 不是 JavaScript。对象和地图/字典没有自动等价关系。如果你想做一个Map查找,你必须使用Map语法:where((element) =&gt; element['status'] == 'Closed')。此外,您需要将结果分配给某物(并且可能希望将其转换为 List)。

标签: json flutter api dart filter


【解决方案1】:

.where 将创建一个新的修改列表,但不会修改原始列表。重新分配原始列表或返回修改后的列表。在这种情况下,我认为 2 更好,因为我们只对列表进行一次过滤操作。

此外,.where 将返回 Iterable,它是 List 的超类。由于您的函数返回 List,我们必须使用 .toList()Iterable 转换为 List

  1. 重新分配原始列表

    final response = await httpServices.getRequest('mobileAppGetIcbsid?icbsid=001-0000055');
    final jsonData = json.decode(response.data);
    var map = Map<String, dynamic>.from(jsonData);
    var userData = UserModel.fromJson(map);
    
    // Reassign the result of .where to modifiedUserData
    var modifiedUserData = userData.loan?.where((element) => element.status == "Closed");
    
    return modifiedUserList.toList();
    
  2. 返回修改后的列表

    final response = await httpServices.getRequest('mobileAppGetIcbsid?icbsid=001-0000055');
    final jsonData = json.decode(response.data);
    var map = Map<String, dynamic>.from(jsonData);
    var userData = UserModel.fromJson(map);
    
    // Return the result of .where directly
    return userData.loan?.where((element) => element.status == "Closed").toList();
    

【讨论】:

    【解决方案2】:
    void test() {
      var json =
          '{"loan":[{"id":"1", "icbsid": "55","loanId": "null", "status": "Closed"},{"id":"2", "icbsid": "55","loanId": "null", "status": "None"},{"id":"3", "icbsid": "25","loanId": "sss", "status": "None"} ]}';
      final jsonData = jsonDecode(json);
      var map = Map<String, dynamic>.from(jsonData);
      var data = UserModel.fromJson(map);
      data.loan?.removeWhere((model) => model.status != 'Closed');
      data.loan?.forEach((model) {
        pr('id::${model.id}  status::${model.status}');
      });
    }
    
    class UserModel {
      List<Loan>? loan;
      UserModel(this.loan);
      factory UserModel.fromJson(Map<String, dynamic> json) => UserModel(
          (json['loan'] as List<dynamic>?)?.map((e) => Loan.fromJson(e)).toList());
    }
    
    class Loan {
      String? id;
      String? status;
      Loan(this.id, this.status);
      factory Loan.fromJson(Map<String, dynamic> json) =>
          Loan(json['id'], json['status']);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 2021-12-22
      • 2017-06-18
      • 2021-04-09
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多