Flutter Dio返回DioErrorType.unknown问题排查求助
问题排查:Dio返回200状态码却抛出DioErrorType.unknown异常
问题场景
在采用Clean Architecture的Flutter项目中,使用Dio作为HTTP请求库,并集成PrettyDioLogger拦截器记录请求日志。日志显示接口返回200 OK状态,但实际代码中捕获到DioErrorType.unknown错误,无法获取真实的响应内容。
核心原因分析
问题出在响应实体类的序列化环节:
ForgotPasswordResponse类的构造函数声明了required this.support,要求support字段为必填项- 当接口返回的JSON中
support字段不存在、为null,或者与预期类型不匹配时,调用ForgotPasswordResponse.fromJson()会抛出参数缺失的异常 - Retrofit与Dio的集成逻辑会将这种序列化阶段的异常包装为
DioErrorType.unknown抛出,导致上层代码误以为是请求本身失败,而非后续的序列化错误
解决方案
修改ForgotPasswordResponse的构造函数,将support参数改为可选参数,避免因字段缺失导致序列化失败:
@JsonSerializable() class ForgotPasswordResponse extends BaseResponse { @JsonKey(name: "support") String? support; // 去掉required修饰符,改为可选参数 ForgotPasswordResponse({this.support}); factory ForgotPasswordResponse.fromJson(Map<String, dynamic> json) => _$ForgotPasswordResponseFromJson(json); Map<String, dynamic> toJson() => _$ForgotPasswordResponseToJson(this); }
修改后重新运行代码生成命令(flutter pub run build_runner build),确保序列化代码同步更新。此时即使接口返回的support字段为null或缺失,序列化过程也能正常完成,上层代码就能获取到完整的响应数据。
补充验证
可以在catch块中打印完整错误信息,确认是否是序列化问题:
catch (error) { if (error is DioError) { log('error type: ${error.type}'); log('error message: ${error.message}'); log('error stacktrace: ${error.stackTrace}'); } else { // 直接打印非Dio异常,排查序列化错误 log('unexpected error: $error'); } }
内容的提问来源于stack exchange,提问作者siba36
相关产品推荐
相关产品推荐

