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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:37:12