代码之家  ›  专栏  ›  技术社区  ›  sayayin

如何解决Flutter/Dart中的List<dynamic>类型错误

  •  0
  • sayayin  · 技术社区  · 4 年前

    我对飞和飞镖很陌生。试图从这个未来返回一个从api中提取数据的列表,但我一直收到这个错误。这里有人帮我解决了一个类似的错误,通过转换为列表,因为我在一个返回可迭代对象的数组上调用map函数,但在这种情况下,我不确定需要做什么。

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

    数据接收方式如下:

    {
     "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"
            },
    }
    

    以下是未来的代码:

    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');
      }
    }
    

    城市等级:

    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 回复  |  直到 4 年前
        1
  •  0
  •   ישו אוהב אותך Mahavir    4 年前

    你需要回来 List<City> 在你的方法。因此,更改以下代码:

    List citiesList = [];
    

    List<City> citiesList = [];
    

    ---更新---

    您需要使用City构造函数或工厂从json生成项目,如下所示:

    City.fromJson(dataMap[city]);
    
    // Or
    
    City(cityCode: dataMap[city]['Feature_int_id'],
            cityName: dataMap[city]['Feature_str_name']
        );
    

    这里是更新的示例代码:

    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;
    }