Flutter 2.0空安全之数据模型(Model)空安全适配技巧
数据模型(Model)空安全适配主要以下两种情况:
- 含有命令构造函数的模型
- 含有命名工厂构造函数的模型
含有命令构造函数的模型
含有命令构造函数的模型的空安全适配技巧:
适配前:
///数据模型
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修饰符来表示这个参数是必传参数