Flutter 类型 '_InternalLinkedHashMap<String, dynamic>' 不是 'List<dynamic>' 类型的子类型

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

我是 Flutter 语言学习者,刚接触这个世界,

我有一个 json 像:

{
  "USDBRL":
  {
    "id": "...",
    "name": "...",...
  }
}

我的美元模型:

class Dolar {
  String param1;
  String param2;

  // Constructor
  Dolar({
    required this.param1,
    required this.param2,
  });

  factory Dolar.fromJson(Map<String, dynamic> json) {
    return Dolar(
      param1: json['param1'],
      param2: json['param2'],
    );
  }
}

我需要获取所有“USDBRL”字段,但是当我 运行 应用程序时,我得到“flutter: type '_InternalLinkedHashMap' is not a subtype of type 'List<dynamic>' ".

我试过在 Internet 上搜索解决方案,但 none 我试过的替代方案都奏效了。

当“USDBRL”是地图时,您错误地将其转换为列表。

去掉这一行: List<dynamic> body = json["USDBRL"];

并替换为这一行: Map<String, dynamic> body = json["USDBRL"];

这应该可以解决您看到的转换错误。

要解决 toList 错误,您需要更改获取 Dolar 的方式。

Dolar dolar = Dolar.fromJson(body);

这是因为“USDBRL”不包含项目列表。它是一个具有属性和值的对象。我假设“USDBRL”中的那些值是您想要用来配置 Dolar 对象中的数据的值。所以你只需将它更改为 Dolar 的单个实例,它从“USDBRL”映射中获取数据。

最终代码可能如下所示:

Future<Dolar> getDolar() async {
    try {
        Response res = await get(Uri.parse(endPointUrl));
        if (res.statusCode==200) {
            final json = jsonDecode(res.body);
            Dolar dolar = Dolar.fromJson(json["USDBRL"] as Map<String, dynamic>);
            return dolar;
        } else {
            throw ("Can't access the Dolar API");
        }
    } catch (e) {
        print(e);
        rethrow;
    }
}

你能试试这个查询吗?您需要用 'as'.

定义 class
final Map<String, dynamic> jsonResult = jsonDecode(response.body);

List<Dolar> dolar  =  (jsonResult['USDBRL']
              as List<dynamic>)
          .map((data) => Dolar.fromJson(data))
          .toList();

fromJson 应该会喜欢这个。

factory Dolar.fromJson(Map<String, dynamic> json) {
    return Dolar(
      param1: json['id'],
      param2: json['name'],
    );
  }