数据模型(Model)空安全适配主要以下两种情况:

  1. 含有命令构造函数的模型
  2. 含有命名工厂构造函数的模型

含有命令构造函数的模型

含有命令构造函数的模型的空安全适配技巧:

适配前:
///数据模型
class ItemModel {
  int totalCount;
  List<Item> resultList;
  ItemModel.fromJson(Map<String, dynamic> json) {
    totalCount = json['totalCount'];
    if (json['resultList'] != null) {
      resultList = new List<Item>();
      json['resultList'].forEach((v) {
        resultList.add(new Item.fromJson(v));
      });
    }
  }
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['totalCount'] = this.totalCount;
    if (this.resultList != null) {
      data['resultList'] = this.resultList.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

适配之前首先要和后端服务协商好,在数据模型中那些字段可空,那些字段是不为空的。以上代码中假如:totalCount字段是一定会有数据,resultList字段是不能保证有数据,那么我们可以这样来适配:

适配后:
///数据模型
class ItemModel {
  late int totalCount; 
  List<Item>? resultList;

  //命名构造方法
  ItemModel.fromJson(Map<String, dynamic> json) {
    totalCount = json['totalCount'];
    if (json['resultList'] != null) {
      resultList = new List<Item>.empty(growable: true);
      json['resultList'].forEach((v) {
        resultList!.add(new Item.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['totalCount'] = this.totalCount;
    data['resultList'] = this.resultList!.map((v) => v.toJson()).toList();
    return data;
  }
}
  • 对于一定会下发的字段我们通过late来修饰为延迟初始化的字段以方便访问
  • 对于不能保证一定会下发的字段,我们通过?将其修饰为可空的变量

含有命名工厂构造函数的模型

命名工厂构造函的数据模型也是比较常见的数据模型之一,有命名工厂构造函的数据模型的空安全适配技巧如下:

适配前:
class ResponseResult {

  /// 成功标记 true:成功;false:失败
  bool status;

  /// 消息
  String info;

  /// 数据
  dynamic data;

  ResponseResult({this.status, this.info, this.data});

  factory ResponseResult.fromJson(Map<String, dynamic> json) {
    return ResponseResult(
      status: json['status'],
      info: json['info'],
      data: json['data']
    );
  }

  @override
  String toString() {
    return 'ResponseResult{status: $status, info: $info, data: $data}';
  }

  Map<String, dynamic> toJson () {
    Map<String, dynamic> _m = new Map<String, dynamic>();
    _m["status"] = this.status;
    _m["info"] = this.info;
    _m["data"] = this.data;
    return _m;
  }
}

含有命名工厂构造函数的模型通常需要有自己的构造函数,构造函数通常采用可选参数,所以在进行适配时首先要明确哪些字段一定不为空,哪些字段可空,确认好之后就可以进行下面适配了:

适配后:
class ResponseResult {

  /// 成功标记 true:成功;false:失败
  bool status;

  /// 消息
  String? info;

  /// 数据
  dynamic? data;

  ResponseResult({required this.status, this.info, this.data});

  factory ResponseResult.fromJson(Map<String, dynamic> json) {
    return ResponseResult(
      status: json['status'],
      info: json['info'],
      data: json['data']
    );
  }

  @override
  String toString() {
    return 'ResponseResult{status: $status, info: $info, data: $data}';
  }

  Map<String, dynamic> toJson () {
    Map<String, dynamic> _m = new Map<String, dynamic>();
    _m["status"] = this.status;
    _m["info"] = this.info;
    _m["data"] = this.data;
    return _m;
  }
}
  • 对于可空的字段通过?进行修饰
  • 对于不可空的字段,需要在构造方法中在对应的字段前面添加required修饰符来表示这个参数是必传参数

标签: Flutter 2.0, Flutter 2.0空安全, Flutter 2.0空安全之数据模型shi'pei

添加新评论