You need to enable JavaScript to run this app. Flutter 2.+空安全下Dio用自定义模型类可空属性设置问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 2.+空安全下Dio用自定义模型类可空属性设置问题求助

自定义模型类适配空安全的具体方案

1. 基础可空声明

自定义模型类和基础类型的可空声明规则完全一致,直接在自定义类型名称末尾加?即可声明为可空类型,示例如下:

// 错误写法:未声明可空,接口返回空值时直接触发空安全报错
class ApiResponse {
  int? code;
  String? message;
  UserModel data; // 自定义类型未加?,非空强制要求赋值
}

// 修正后写法
class ApiResponse {
  int? code;
  String? message;
  UserModel? data; // 加?声明为可空,允许data为null
}

2. JSON解析逻辑适配可空

声明可空后需要同步修改fromJson解析逻辑,遇到对应字段为null时不要强行调用子模型的fromJson方法:

class ApiResponse {
  int? code;
  String? message;
  UserModel? data;

  ApiResponse.fromJson(Map<String, dynamic> json) {
    code = json['code'];
    message = json['message'];
    // 先判断字段是否为null再做解析
    if (json['data'] != null) {
      data = UserModel.fromJson(json['data']);
    } else {
      data = null;
    }
  }
}

class UserModel {
  String? username;
  int? age;

  UserModel.fromJson(Map<String, dynamic> json) {
    username = json['username'];
    age = json['age'];
  }
}

3. 自动生成方案(推荐)

如果手写模型类容易出错,可以使用官方推荐的json_serializable库自动生成空安全兼容的解析代码,只需给所有可空字段(包括自定义类型)加?声明,生成的代码会自动处理空值判断逻辑,不需要手动写判空代码。

常见报错原因

这类运行时报错通常是两种情况导致:

  • 自定义类型字段没有加?声明可空,接口返回空值时空安全校验不通过
  • 已经声明可空,但fromJson里没有做判空就直接调用子模型的fromJson方法,传入null触发报错

内容的提问来源于stack exchange,提问作者Taki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:15:07