You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDK从29升级到31报错:Map<dynamic, dynamic>无法赋值给Map<String, dynamic>

问题原因

你升级到SDK 31后,对应的Dart版本启用了更严格的静态类型检查,禁止了隐式的dynamic到String类型转换。json.decode()解析返回的JSON数组中,Map元素的默认推导类型为Map<dynamic, dynamic>,但UserDetails.fromJson方法要求入参为Map<String, dynamic>,因此触发类型不匹配报错。

解决方案

可任选以下任意一种方式修复:

方案1:遍历阶段显式声明Map键类型

直接修改循环处的变量类型声明即可:

setState(() {
  // 将原有Map user替换为Map<String, dynamic> user
  for (Map<String, dynamic> user in responseJson) {
    _userDetails.add(UserDetails.fromJson(user));
  }
});

方案2:传参时做类型强转

如果不想修改遍历逻辑,也可以在调用fromJson时用as关键字做类型转换:

setState(() {
  for (Map user in responseJson) {
    _userDetails.add(UserDetails.fromJson(user as Map<String, dynamic>));
  }
});

方案3(可选):调整fromJson入参类型兼容泛型Map

如果业务场景确实可能存在非String类型的键,可以修改fromJson的入参定义,内部取值时再做类型转换:

factory UserDetails.fromJson(Map json) {
  return UserDetails(
    sealed: json['sealed'] as String,
    name: json['name'] as String,
    seal_number: json['seal_number'] as String,
    date: json['date'] as String,
    userSL: json['user'] as String,
  );
}

注意:该方案会关闭对应参数的静态类型检查,需要你自行确保JSON键为String类型、对应值为String类型,否则运行时会抛出转换异常,更推荐使用前两种方案。

内容的提问来源于stack exchange,提问作者Andrii Havrylyak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:36:02