'_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>' in type cast

Viewed 773

I have been at this one for hours and I can not figure out what I am doing wrong. I am requesting JSON from a remote server and trying to place it into a model. When I run the below code, I get Unhandled Exception: Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List' in type cast.

Here is the JSON response:

{
    "status": 200,
    "data": {
        "name": "Radio Data",
        "month": "Jan 2022",
        "data": [
            {
                "client_id": 172064,
                "client_name": "Company LLC",
                "value": 150
            },
            {
                "client_id": 202947,
                "client_name": "Communications",
                "value": 150
            },
            {
                "client_id": 200608,
                "client_name": "Broadcasting Company",
                "value": 150
            },
            {
                "client_id": 204702,
                "client_name": "Broadcasting Group",
                "value": 75
            },
            {
                "client_id": 202207,
                "client_name": "Broadcasting Company Inc.",
                "value": 150
            },
            {
                "client_id": 199586,
                "client_name": "Western College",
                "value": 300
            }
        ]
    }
}

This is the OnAir model

class OnAir {
  String? name;
  String? month;
  List<Data>? data;

  OnAir({required this.name, required this.month, required this.data});

  OnAir.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    month = json['month'];
    if (json['data'] != null) {
      data = <Data>[];
      json['data'].forEach((v) {
        data?.add(Data.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['name'] = name;
    data['month'] = month;
    data['data'] = this.data?.map((v) => v.toJson()).toList();
    return data;
  }
}

class Data {
  int? clientId;
  String? clientName;
  int? value;

  Data({required this.clientId, required this.clientName, required this.value});

  Data.fromJson(Map<String, dynamic> json) {
    clientId = json['client_id'];
    clientName = json['client_name'];
    value = json['value'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['client_id'] = clientId;
    data['client_name'] = clientName;
    data['value'] = value;
    return data;
  }
}

And this is the network call, which I call from another page, using FutureBuilder.


fetchOnAir(int id);


List<OnAir> parseOnAir(String responseBody){
    var list = json.decode(responseBody);
    var listData = list['data'] as List<dynamic>;
    List<OnAir> onAir = listData.map((model) => OnAir.fromJson(model)).toList();
    return onAir;
}

Future<List<OnAir>> fetchOnAir(int id) async{
    final accessToken = await AuthService().getAccessToken();
    final url = AuthService().getServiceUrl() + 'userOnAir?id=$id&access_token=$accessToken';
    final response = await http.get(Uri.parse(url));
    if(response.statusCode == 200){
        return compute(parseOnAir, response.body);
    }else{
        throw Exception('Request API Error');
    }
}

Any guidance would be truly appreciated.

1 Answers

Here, your model should look like this;

class OnAir {
  int? clientId;
  String? clientName;
  int? value;

  OnAir({this.clientId, this.clientName, this.value});

  OnAir.fromJson(Map<String, dynamic> json) {
    clientId = json['client_id'];
    clientName = json['client_name'];
    value = json['value'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['client_id'] = this.clientId;
    data['client_name'] = this.clientName;
    data['value'] = this.value;
    return data;
  }
}
Related