空安全与Null检查:fromJson方法空值处理报错问题
解决Dart中
Null不是String子类型的错误 看起来你遇到的问题有点棘手——明明用了??""来兜底Null情况,却还是触发了类型不匹配的错误。让我帮你拆解原因,再给出靠谱的修复方案:
问题根源
虽然你写了j["DialCode"]??"",但因为你的入参是Map<String, dynamic>类型,j["DialCode"]返回的是dynamic类型的值。在Dart空安全模式下,当这个值是Null时,直接用??""有时候会因为类型推断的模糊性,运行时没能正确识别Null应该被替换为空字符串,反而把Null直接赋值给了非nullable的String类型参数(也就是_TheCountry的dialCode字段),从而触发错误。
解决方案
最可靠的修复方式是显式将j["DialCode"]转换为可空的String?类型,再用??提供默认值,这样能明确告诉Dart该如何处理Null场景:
static fromJson(Map<String, dynamic> j) { return _TheCountry( name: (j["Name"] as String?) ?? "", dialCode: (j["DialCode"] as String?) ?? "", iso2Code: (j["Iso2"] as String?) ?? "", englishName: (j["EnglishName"] as String?) ?? "", iso3Code: (j["Iso3"] as String?) ?? "", currency: (j["Currency"] as String?) ?? "", capital: (j["Capital"] as String?) ?? "", dialLengths: List.castFrom(getDialLengths((j["DialLength"] as String?) ?? "")), ); }
另外,你也可以同步检查测试数据:
- 确认
DialCode键的拼写和JSON里的完全一致(Dart对键名大小写敏感!),如果JSON里是小写的dialCode,那j["DialCode"]自然会返回Null; - 确认
DialCode对应的值确实是Null或字符串类型,如果是数字等其他类型,也可能触发类型不匹配错误。
额外说明
这种显式类型转换的方式在处理dynamic类型的Map时非常实用,能避免很多因类型推断模糊导致的运行时错误,让代码的类型安全更有保障。
内容的提问来源于stack exchange,提问作者Yadhu
相关产品推荐
相关产品推荐

