0
votes

I am very new to flutter and dart. Trying to return a list from this future that pulls data from an api but I keep getting this error. Someone here helped me solve a similar error by casting to a list because I was calling map function on an array that returns an iterable but in this case here I'm not sure what needs to be done.

type List<dynamic> is not a subtype of type FutrueOr<ListCity>>

Data is received like below:

{
 "data": {
        "127287": {
            "Feature_int_id": "127287",
            "Admin1_str_code": "US06",
            "Country_str_code": "US",
            "Feature_str_name": "Acampo",
            "Feature_dec_lat": "38.194",
            "Feature_dec_lon": "-121.25"
        },
        "116496": {
            "Feature_int_id": "116496",
            "Admin1_str_code": "US06",
            "Country_str_code": "US",
            "Feature_str_name": "Acton",
            "Feature_dec_lat": "34.49",
            "Feature_dec_lon": "-118.22"
        },
        "124284": {
            "Feature_int_id": "124284",
            "Admin1_str_code": "US06",
            "Country_str_code": "US",
            "Feature_str_name": "Adelanto",
            "Feature_dec_lat": "34.665",
            "Feature_dec_lon": "-117.512"
        },
}

Below is the code for future:

Future<List<City>> fetchCitiesByProvince(provinceCode) async {
  final response = await http.get(Uri.https('localhost/msd', 'api/cities/' + provinceCode));
  final responseJson = json.decode(response.body);
  final dataMap =  responseJson['data'];

  if (response.statusCode == 200) {
 
    List citiesList = [];
    for (var city in dataMap.keys) {
      if (dataMap[city]['Admin1_str_code'] == provinceCode) {
        citiesList.add(
          {
            'cityCode': dataMap[city]['Feature_int_id'],
            'cityName': dataMap[city]['Feature_str_name']
          }
        );
      }
    }
    return citiesList;
  } else {
    throw Exception('Failed to load cities');
  }
}

City Class:

class City {
  final String cityCode;
  final String cityName;

  City({@required this.cityCode, @required this.cityName});

  factory City.fromJson(Map<String, dynamic> json) {

    return City(
      cityCode: json['Feature_int_id'],
      cityName: json['Feature_str_name']
    );
  }
}
1

1 Answers

0
votes

You need to return List<City> in your method. So, change the following code:

List citiesList = [];

to

List<City> citiesList = [];

--- UPDATE ---

You need to user your City constructor or factory to generate the item from json like this:

City.fromJson(dataMap[city]);

// Or

City(cityCode: dataMap[city]['Feature_int_id'],
        cityName: dataMap[city]['Feature_str_name']
    );

Here the updated sample code:

Future<List<City>> fetchCitiesByProvince(provinceCode) async {
  final response = await http.get(Uri.https('localhost/msd', 'api/cities/' + provinceCode));
  final responseJson = json.decode(response.body);
  final dataMap =  responseJson['data'];

  List<City> citiesList = [];

  if (response.statusCode == 200) {
    
    for (var city in dataMap.keys) {
      if (dataMap[city]['Admin1_str_code'] == provinceCode) {
        citiesList.add(City.fromJson(dataMap[city]));
      }
    }
  } else {

    throw Exception('Failed to load cities');
    // either throwing an error or return empty list.
  }

  return citiesList;
}