flutter开发必备VSCode插件之: Dart DTO Generator

405 阅读2分钟

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;
  
}

image.png

生成的代码结果如下

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;
}

image.png

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

image.png

尾声

为什么网上关于介绍这类东西的很少?是大家都热衷于手写DTO类?还是大家都有其他更优雅的转换方式?