Flutter代码生成插件dartgenerate的使用
Flutter代码生成插件dartgenerate的使用
简介
DartGenerate 是一个用于 Dart 的内联代码生成器集合。它可以为你的 Flutter 或 Dart 项目生成 JSON 序列化器、带有映射值和可迭代项的枚举、导出索引等。
与标准代码生成器不同,DartGenerate 不会生成 .g.dart
文件。相反,它将代码直接插入到实际定义中。这与 dartfmt
类似。这种方式类似于 Java IDE 生成字段的 getter 和 setter 方法。该流程的目标是保持项目的整洁并使代码库更易读。
特性
- 生成带有序列化的枚举。
- 生成模型序列化器。你也可以在这些模型中添加枚举。
- 从目录生成索引文件。此文件将导出所有
.dart
文件。 - 嵌入目录中的文件。
- 监视文件更改。
- 配置文件以设置多个生成器。
- 选项以启用目录的递归遍历。
安装
从 pub 安装
$ pub global activate dartgenerate
从 git 安装
$ pub global activate --source git https://github.com/ajinasokan/dartgen
确保设置了 pub
的 $PATH
。验证安装可以运行以下命令:
$ dartgenerate
No dartgenerate.json found in this directory.
Example config:
{
"dir": "lib",
"generators": [
{ "dir": "lib/models", "type": "model" },
{ "dir": "lib/models", "type": "index" },
{ "dir": "lib/constants", "type": "constant" },
{ "dir": "lib/constants", "type": "index" },
],
}
要以监听模式运行:
$ dartgenerate watch
配置
{
"dir": "lib",
"generators": [
{ "dir": "lib/models", "type": "model" },
{ "dir": "lib/models", "type": "index" },
{ "dir": "lib/constants", "type": "constant" },
{ "dir": "lib/constants", "type": "index" },
{ "dir": "lib/components", "type": "index", "recursive": true },
{ "dir": "lib/screens", "type": "index", "recursive": true },
{ "dir": "lib/svgs", "type": "embed" }
]
}
解释:
.dir
指定要监视文件更改的目录。运行dartgenerate watch
时会考虑这一点。.generators
列出所有要运行的生成器。可以是model
、constant
、index
或embed
生成器。可以在同一目录中执行多种类型的生成器。.generators.dir
设置特定生成器要运行的目录。.generators.type
设置要在上述目录中运行的生成器类型。.generators.recursive
设置是否递归地在目录中运行此生成器。
代码生成
生成过程以代码及其内部的注解作为输入,并生成适当的代码并将其注入回代码中。这显然是对代码的修改,就像 dartfmt
一样。因此建议对代码进行版本控制(例如使用 Git 或其他方法),以便如果生成导致任何损坏可以恢复。
生成模型
你应该这样编写代码:
import 'dart:convert';
@pragma('model')
class Address {
@pragma('json:street_name')
String streetName = "NA";
}
@pragma('model')
告诉 DartGenerate 为该类生成模型。这包括构造函数、映射转换、JSON 转换和序列化方法。@pragma('json:street_name')
在字段上的注解为其 JSON 中的字段提供别名。如果不指定这样的别名,它将不会成为序列化的一部分。你可以为字段指定默认值。如果未初始化字段、字段不存在或 JSON 中的字段为空,则会使用该默认值。
你可以使用所有支持 JSON 的数据类型、它们的列表和映射、其他模型以及由 DartGenerate 生成的枚举和 Decimal。
可以选择添加 @pragma('model', 'patchWith,clone')
标志以生成字段修补和克隆方法。这个克隆方法只做浅层克隆。如果你需要深层克隆,可以使用 toJson
和 fromJson
方法。
你可以在模型中保留额外的方法,这些方法会被保留不变。
生成枚举
定义你的枚举如下:
@pragma('enum')
class Color {
static const Red = Color('red');
static const Green = Color('green');
}
DartGenerate 会生成迭代器、等效性检查等。这些枚举会在模型生成期间被识别。因此它们将被正确地序列化。
生成导出索引
如果你有一个非常大的项目,如果所有 Dart 文件都被导出会更方便。Dart 在存在名称冲突的情况下处理循环导入非常出色。
如果你在 dartgenerate.json
中启用了索引生成,它将在该目录中生成 index.dart
文件,内容如下:
export 'address.dart';
export 'person.dart';
如果你处于监听模式,这将在添加/删除文件时自动更新。
嵌入文件
这在你需要嵌入小文本文件(如 SVG、HTML、CSV 等)时很有用。在代码中而不是资源中嵌入文件将帮助你同步且即时访问这些文件。请注意,如果文件大小很大,这也会增加应用程序的二进制大小,可能导致加载时间变慢。
你可以在 dartgenerate.json
中为目录启用嵌入生成器,它将生成 index.dart
文件,内容如下:
final eulatxt = 'MIT License';
final imagesvg =
'<!DOCTYPE html>\n<html>\n<body>\n\n<svg height="100" width="100">\n <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />\n Sorry, your browser does not support inline SVG. \n</svg> \n \n</body>\n</html>\n';
更多关于Flutter代码生成插件dartgenerate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter代码生成插件dartgenerate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 dart_code_generator
(假设这是您提到的 dartgenerate
插件的通用名称,因为具体的插件名称可能有所不同)来生成 Flutter 代码的简单示例。请注意,实际的插件名称和功能可能会有所不同,因此这里的示例是基于假设的插件功能和典型的代码生成插件的使用方式。
首先,确保您已经在 pubspec.yaml
文件中添加了该插件的依赖项。假设插件名为 dart_code_generator
:
dependencies:
flutter:
sdk: flutter
dart_code_generator: ^x.y.z # 替换为实际版本号
然后,运行 flutter pub get
来获取依赖项。
接下来,我们假设 dart_code_generator
插件允许我们通过注解来标记需要生成代码的类,并自动生成相应的数据访问对象(DAO)代码。以下是一个简单的示例:
- 定义数据模型:
// models/user.dart
part 'user.g.dart'; // 自动生成代码的文件
@GenerateCode() // 假设这是插件提供的注解
class User {
final String name;
final int age;
User({required this.name, required this.age});
// 其他方法...
}
- 运行代码生成器:
通常,代码生成插件会在构建过程中自动生成代码。但是,您可能需要配置 build_runner
来运行代码生成任务。在项目的根目录下创建一个 build.yaml
文件(如果尚不存在):
targets:
$default:
builders:
dart_code_generator: # 假设这是插件提供的构建器名称
enabled: true
然后,在终端中运行以下命令来生成代码:
flutter pub run build_runner build
这将触发 dart_code_generator
插件来生成 user.g.dart
文件。
- 查看生成的代码:
生成的 user.g.dart
文件可能包含类似以下内容(这只是一个示例,实际生成的内容取决于插件的实现):
// user.g.dart - 自动生成的文件,不要手动编辑
part of 'user.dart';
// 假设生成的 DAO 类
class UserDao {
// 假设的方法,用于数据库操作等
Future<void> saveUser(User user) async {
// 实现保存用户的逻辑
}
Future<User?> getUserById(int id) async {
// 实现获取用户的逻辑
return User(name: 'John Doe', age: 30); // 示例数据
}
}
- 使用生成的代码:
现在,您可以在项目的其他部分中使用生成的代码:
void main() async {
User user = User(name: 'Alice', age: 25);
UserDao userDao = UserDao();
await userDao.saveUser(user);
User? retrievedUser = await userDao.getUserById(1); // 假设ID为1
print('Retrieved User: ${retrievedUser?.name}, Age: ${retrievedUser?.age}');
}
请注意,上述代码是基于假设的插件功能和典型的代码生成插件的使用方式。实际的 dartgenerate
或类似插件可能会有不同的配置和使用方法,因此请参考具体插件的文档以获取准确的用法。