0
votes

I have following Model

class ModelCompanies {
  int id;
  String companyid;
  String companyName;
  String name;
  String activeStatus;

  ModelCompanies(
      {this.id, this.companyid, this.companyName, this.name, this.activeStatus});

  ModelCompanies.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    companyid = json['companyid'];
    companyName = json['companyName'];
    name = json['name'];
    activeStatus = json['activeStatus'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['companyid'] = this.companyid;
    data['companyName'] = this.companyName;
    data['name'] = this.name;
    data['activeStatus'] = this.activeStatus;
    return data;
  }
}

And I have following method

Future<ModelCompanies> fetchCompanies() async {
    //encode Map to JSON

    final response = await _dio.get(
        globals.apiUrl + "get-companies",
        options: buildCacheOptions(Duration(hours: _cachePriorityDurationHours),
            forceRefresh: true,
            maxStale: Duration(days: _networkPriorityDurationDays)));

    if (response.statusCode == 200) {
      return ModelCompanies.fromJson(response.data);
    } else {
      throw new Exception("Failed to load post.");
    }
  }

The JSON Format from API.

[
   {
      "id":123,
      "companyid":"XYZ-123",
      "companyName":"XYZ Corporation",
      "name":"(XYZ) XYZ Corporation",
      "activeStatus":"A"
   },
   {
      "id":248,
      "companyid":"PQR-248",
      "companyName":"PQR Holdings Limited",
      "name":"(PQR) PQR Holdings Limited",
      "activeStatus":"A"
   },
   {
      "id":397,
      "companyid":"MNO-397",
      "companyName":"MNO Adventures",
      "name":"(MNO) Adventures",
      "activeStatus":"A"
   }
]

Problem The line return ModelCompanies.fromJson(response.data); in method fetchCompanies gives error List<dynamic> is not a subtype of type Map<String, dynamic>

I looked for other solutions for similar problem in SO, but cannot make them work (As I am fairly new to flutter and dart).

What I tried is

 Map<String, dynamic> jsonResponse = response.data.map((item) {
        return {
          "id": item["id"],
          "companyid": item["companyid"],
          "companyName": item["companyName"],
          "name": item["name"],
          "activeStatus": item["activeStatus"]
        };
      }).toList(); 

      return ModelCompanies.fromJson(jsonResponse );

But this too throwing same error.

1

1 Answers

0
votes

response.data contains a JSON String, which contains a List of objects, therefore we should replace the following lines:

if (response.statusCode == 200) {
 return ModelCompanies.fromJson(response.data);
}

To:

if (response.statusCode == 200) {
 List<ModelCompanies> modelCompanies = 
    List<ModelCompanies>.from(
       response.data.map((model)=> ModelCompanies.fromJson(model)
      ) 
    );
}