【问题标题】:type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>''List<dynamic>' 类型不是 'Map<dynamic, dynamic>' 类型的子类型
【发布时间】:2020-05-19 18:13:38
【问题描述】:

当我尝试将 .json 映射到对象列表时遇到一些问题,首先是使用的 .json:

[{
"name": "Peru",
"capital": "Lima",
"region": "Americas",
"subregion": "South America",
"population": 31488700
}]

接下来是模型:

import 'dart:convert';

import 'package:clean_architecture_tdd_course/features/country_info/domain/entities/country_info.dart';
import 'package:meta/meta.dart';

List<CountryInfoModel> countryFromJson(String str) => new 
List<CountryInfoModel>.from(json.decode(str).map((x) => CountryInfoModel.fromJson(x)));
String countryToJson(List<CountryInfoModel> data) => json.encode(new List<dynamic>.from(data.map((x) 
  => x.toJson())));

class CountryInfoModel extends CountryInfo {
  CountryInfoModel({
  @required String name,
  @required String capital,
  @required String region,
  @required String subregion,
  @required int population,

}) : super(name:name, capital:capital, region:region, subregion:subregion, population:population);

factory CountryInfoModel.fromJson(Map<String, dynamic> json) {
  return CountryInfoModel(
    name: json['name'],
    capital: json['capital'],
    region: json['region'],
    subregion: json['subregion'],
    population: (json['population'] as num).toInt()
  );
}

Map<String, dynamic> toJson() {
  return {
    'name': name,
    'capital': capital,
    'region': region,
    'subregion': subregion,
    'population': population
  };
}

}

最后对此进行了测试,在这一部分中,我创建了用于资产的模型示例,如果 tojson 函数是正确的:

void main() {
  final tCountryInfoModel = CountryInfoModel(name: 'Peru', capital: 'Lima', region: "Americas",
      subregion: "South Americas", population: 31488700);


group('fromJson', () {
test(
  'should return a valid model',
  () async {
    // arrange
    final Map jsonMap =
        json.decode(fixture('country_info.json'));
    // act
   final result = countryFromJson(jsonMap.toString());
    // assert
    expect(result[0], tCountryInfoModel);
  },
);

当我运行测试时,它会抛出这个:

type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>'
test\features\country_info\data\models\country_info_model_test.dart 27:19  main.<fn>.<fn>

【问题讨论】:

    标签: json list object flutter


    【解决方案1】:

    你在测试中犯了一个简单的错误:

    // arrange
    final Map jsonMap =
        json.decode(fixture('country_info.json'));
    // act
    final result = countryFromJson(jsonMap.toString());
    

    改成这样:

    final result = countryFromJson(fixture('country_info.json'));
    

    因为在countryFromJson里面,你又在解码了。

    【讨论】:

    • @AlexTiconaBejarano 我的解决方案解决了您的问题吗?如果是这样,您可以将其标记为正确。
    • 现在我遇到了这个问题:类型 'List' 不是类型 'Map' test\features\country_info\data\models\country_info_model_test.dart 的子类型 30 :19 main..
    • @AlexTiconaBejarano 你试过我的解决方案了吗?
    • 是的,我改变了这一行:最终结果 = countryFromJson(fixture('country_info.json'));
    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2021-12-02
    • 2019-04-03
    • 2021-12-29
    • 2023-01-08
    • 2021-10-25
    • 2020-07-03
    • 2019-12-05
    相关资源
    最近更新 更多