Flutter代码生成或模型生成插件mgen_cli的使用
Flutter代码生成或模型生成插件mgen_cli的使用
Mgen_cli
简介
mgen
(模型生成器)是一个易于使用的命令行工具,可以帮助生成序列化模型。
在YAML文件中定义您的模型,并通过一个命令生成模型。
使用方法
以下是设置项目的步骤:
- 在终端中运行
dart pub global activate mgen_cli
。 - 向项目根目录添加一个名为
models.yaml
的文件并指定您的模型(参见定义模型部分)。 - 打开项目根目录的终端并运行
mgen generate
。
可选地,您可以使用 -m
标志来定义写入模型的确切文件路径,以及 -y
标志来定义YAML文件的位置:
mgen generate [-m path/to/file/file.dart] [-y path/to/yaml/file.yaml]
默认情况下,models.yaml
文件位于根目录,而 model.dart
文件位于 lib
目录。
定义模型
您可以这样定义一个模型:
Person:
name: String
age: int
您可以为字段指定这些类型:bool
、double
、int
、String
和 DateTime
,以及这些类型的列表或映射。
您还可以将其他模型作为类型:
Person:
name: String
age: int
livesAt: Location
friends: List<Person>
Location:
hourseNr: int
street: String
city: String
如果模型文件中有任何错误,这很可能是由于提交了不允许的类型。未来将支持自定义类型。
模型特性
所有生成的模型都具有以下功能:
- 它们是不可变的。如果您想了解更多关于不可变性的知识,可以查看这篇Medium文章。
- 它们有一个默认构造函数。
- 它们有一个
Model.fromJson(json)
构造函数,该构造函数接受序列化的Map
(即Map<String, dynamic>
),并尝试将其解析为指定的模型。 - 它们有一个
toJson()
方法,该方法将对象转换为序列化的Map
。 - 它们有一个
copyWith()
方法,该方法接受对象的任何字段,并复制带有这些字段更改的对象。因为模型是不可变的,所以此功能特别有用。
以下示例演示了这些功能:
models.yaml:
Person:
name: String
age: int
livesAt: Location
friends: List<Person>
Location:
hourseNr: int
street: String
city: String
main.dart:
import 'package:my_project/model.dart';
void main() {
// 定义Ernie的位置
// 注意,由于Location的不可变性,它可以是常量
const locationErnie =
Location(hourseNr: 1, street: "Sesame Street", city: "Sesame City");
// 定义Bert的位置
const locationBert =
Location(hourseNr: 2, street: "Sesame Street", city: "Sesame City");
// 定义人物Ernie
// 注意,由于他是第一个创建的人物,我们不能给他任何朋友
const ernie =
Person(name: "Ernie", age: 29, livesAt: locationErnie, friends: []);
// 定义人物Bert
// 由于Ernie已经存在,我们可以让Bert成为Ernie的朋友,
// 但Ernie和Bert刚见面,他们还不是朋友
const bert =
Person(name: "Bert", age: 34, livesAt: locationBert, friends: []);
// 因为Ernie认为Bert是个不错的人,所以他想要Bert作为朋友
// 我们可以这样做,但由于不可变性,我们必须用新朋友复制Ernie
// 注意,这个值不能是常量,因为`copyWith` 是一个函数,我们事先不知道它的值
final ernieWithFriends = ernie.copyWith(friends: [bert]);
// 我们可以将对象转换为JSON
final json = ernieWithFriends.toJson();
print(json);
// 这将打印以下内容
/*
{
name: Ernie,
age: 29,
livesAt: {
hourseNr: 1,
street: Sesame Street,
city: Sesame City
},
friends:
[
{
name: Bert,
age: 34,
livesAt:
{
hourseNr: 2,
street: Sesame Street,
city: Sesame City
}
friends:
[]
}
]
}
*/
// 我们可以从序列化的映射中构建人物,
// 如果JSON正确,则不会导致任何错误
// 在这个脚本中显然是正确的,
// 但在更复杂的情况下,这可能更难保证
final ernieReconstructed = Person.fromJson(json);
print(ernieReconstructed.name);
// 这将打印:"Ernie"
}
如果您想向模型添加更多功能,可以这样做:
extension ShowFriends on Person{
/// 打印所有朋友的名字到控制台
void showFriends(){
for(Person friend in friends){
print(friend.name);
}
}
}
更多关于Flutter代码生成或模型生成插件mgen_cli的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter代码生成或模型生成插件mgen_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
mgen_cli
是一个用于 Flutter 项目的代码生成工具,它可以帮助开发者自动生成模型类、服务类、仓库类等,从而提高开发效率。以下是如何使用 mgen_cli
的基本步骤:
1. 安装 mgen_cli
首先,你需要在全局安装 mgen_cli
。打开终端并运行以下命令:
dart pub global activate mgen_cli
2. 初始化配置
在你的 Flutter 项目根目录下,运行以下命令来初始化 mgen_cli
的配置文件:
mgen init
这将会在项目根目录下生成一个 mgen.yaml
配置文件。你可以根据项目的需求来编辑这个文件。
3. 配置 mgen.yaml
mgen.yaml
文件是 mgen_cli
的配置文件,它定义了代码生成的规则和模板。以下是一个简单的配置示例:
models:
- name: User
properties:
- name: id
type: int
- name: name
type: String
- name: email
type: String
services:
- name: UserService
methods:
- name: fetchUser
returnType: User
parameters:
- name: userId
type: int
repositories:
- name: UserRepository
methods:
- name: getUser
returnType: User
parameters:
- name: userId
type: int
4. 生成代码
配置好 mgen.yaml
后,你可以运行以下命令来生成代码:
mgen generate
mgen_cli
会根据 mgen.yaml
中的配置生成相应的模型类、服务类和仓库类,并将它们保存到指定的目录中。
5. 查看生成的文件
生成的代码文件通常会被保存在 lib/models
、lib/services
和 lib/repositories
目录下。你可以根据需要修改这些文件,或者直接使用它们。
6. 自定义模板
如果你需要自定义生成的代码模板,可以在 mgen.yaml
中指定自定义模板的路径。例如:
templates:
model: templates/model.dart.template
service: templates/service.dart.template
repository: templates/repository.dart.template
你可以在项目根目录下创建 templates
文件夹,并在其中放置自定义的模板文件。
7. 其他命令
mgen_cli
还提供了一些其他命令,例如:
mgen list
:列出所有可用的生成器。mgen clean
:删除所有生成的文件。
8. 集成到项目中
为了确保每次项目构建时都能自动生成代码,你可以将 mgen generate
命令添加到项目的构建脚本中。例如,在 pubspec.yaml
中添加:
scripts:
build: mgen generate && flutter pub run build_runner build