Dart DTO Generator
快速生成DTO类. DTO类做什么用的?
如:
你后端有个User结果,结构大致如下:
class User{
String name;
int age;
}
但你前端可能定义的是
class CustomUser{
// 实际对应 后端 User 的 name 属性值
String customName;
// 实际对应后端 User 的 age 属性值
int customAge;
}
此时你要对应上要怎么做?
方案一: 统一命名,要么你改,要么后端改。
方案二:增加一个转换层,能将User和CustomUser相互转换。
方案一显然不太可能,即使某一方强势,让对方改了,那代码就强耦合了,前后端改代码以后都得如履薄冰,想想以后,某一方随便改了个字段名,另一方立马发难,某某这个字段,这个类怎么是这个名字,之前规定是那个名字啊
方案二互不影响,但会增加前端代码量,并且可能是大量繁琐属性转换的代码,一不留神,就可能写错,此时就是Dart DTO Generator的用武之地,他能快速生成这类代码
使用介绍
定义类和属性,快速生成DTO代码
class User {
final String name;
final String age;
}
生成的代码结果如下
class User {
const User._({
this.name,
this.age,
});
final String name;
final String age;
static User fromJson(Map<String, dynamic> json) {
return User._(
name: json['name'],
age: json['age'],
);
}
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
};
}
static User fromDomain(User domain) {
return User._(
name: domain.name,
age: domain.age,
);
}
User toDomain() {
return User(
name: this.name,
age: this.age,
);
}
}
从一个类,转换成另一个类
后台的User类
class User {
final String? name;
final int? age;
User({
this.name,
this.age,
});
}
前端的CustomPerson类
// 这个注解表示 CustomPerson 类对应的是 User 类
@domainName(User)
class CustomPerson {
// 这个注解表示 customName 属性,对应 User 类的 name 属性
@domainName(name)
final String? customName;
final int? age;
}
VSCode会报错,因为确实不存在@domainName这个注解,不过请忽略,这只是这个插件需要的,生成之后这些注释都会被自动去掉(注意这种DTO必须单独放在一个文件,保持一个类一个文件),生成的代码如下:
class CustomPerson {
const CustomPerson._({
this.customName,
this.age,
});
final String? customName;
final int? age;
static CustomPerson fromJson(Map<String, dynamic> json) {
return CustomPerson._(
customName: json['customName'],
age: json['age'],
);
}
Map<String, dynamic> toJson() {
return {
'customName': customName,
'age': age,
};
}
// 注意这里已经将类对应上了
static CustomPerson fromDomain(User domain) {
return CustomPerson._(
// 注意这里已经将属性对应上了
customName: domain.name,
age: domain.age,
);
}
// 注意这里已经将类对应上了
User toDomain() {
return User(
// 注意这里已经将属性对应上了
name: this.customName,
age: this.age,
);
}
}
更多用法详见:Dart DTO Generator
尾声
为什么网上关于介绍这类东西的很少?是大家都热衷于手写DTO类?还是大家都有其他更优雅的转换方式?