Flutter Web解析API响应报错:期望Map<String,dynamic>却得到Null
报错根因
Expected a value of type 'Map<String, dynamic>', but got one of type 'Null' 报错由模型定义与接口返回结构不匹配直接触发:
- 你预先校验的是接口整体响应体非空,但嵌套字段存在null值:返回列表中id为5、6的条目下,
forBatch节点的result字段实际返回值为null - Freezed生成的序列化模型中,该
result字段被定义为非空必填的Map<String, double>类型,默认生成的fromJson逻辑会对字段做强制类型转换,遇到null值时直接抛出类型不匹配错误,不会自动执行空值兜底。
解决方案
选择对应方案修改模型代码后,重新执行Freezed代码生成命令即可生效:
flutter pub run build_runner build --delete-conflicting-outputs
- 对齐接口返回结构,允许字段为空
将ForBatch类中result字段的类型从非空Map<String, double>修改为可空类型Map<String, double>?,完全适配接口返回null的场景,后续业务逻辑调用该字段时补充判空处理即可。 - 配置默认值兜底,简化后续业务判空逻辑
如果业务逻辑要求该字段始终为Map类型,可通过Freezed的@Default注解给字段配置空Map默认值,接口返回null时会自动填充默认值,不会触发类型报错,示例代码:@freezed class ForBatch with _$ForBatch { const factory ForBatch({ @Default(<String, double>{}) Map<String, double> result, // 其余同原有字段定义 }) = _ForBatch; factory ForBatch.fromJson(Map<String, dynamic> json) => _$ForBatchFromJson(json); }
内容的提问来源于stack exchange,提问作者Harry R
相关产品推荐
相关产品推荐

