skip to Main Content

Response from 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"
    }
]

This is my code and it’s working fine, but I need to filter the 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;

}`

I tried to uncomment this code userData.loan?.where((element) => element.status == "Closed"); it is working fine for displaying the data but not filtering the status. I am expecting to display only the data where status == ‘Closed’

2

Answers


  1. .where will create a new modified list but not modify the original list. Either reassign the original list or return the modified list. In this case I think 2 is better because we are only doing one filter operation to the list.

    Also, .where will return Iterable which is the superclass of List. As your function is returning a List, we have to use .toList() to convert the Iterable to List.

    1. Reassign the original list

      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. Return the modified list

      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();
      
    Login or Signup to reply.
  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']);
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search