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
相关产品推荐
相关产品推荐

