Files
2026-09-04 15:22:20 +08:00

72 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# build_runner 代码生成指南
## 一、是什么
`build_runner` 是 Dart 官方的**代码生成调度器**。它本身不生成任何代码,而是统一调度各个**生成器插件**,根据模型上的注解自动生成 `.g.dart` 文件。
类比:`build_runner` = 工厂流水线调度员,各个生成器插件 = 流水线上的工人。
## 二、当前项目的生成器
| 生成器插件 | 注解 | 生成内容 | 状态 |
|---|---|---|---|
| `isar_community_generator` | `@collection` | Isar 数据库 Schema(增删改查) | ✅ 已配置 |
| `json_serializable` | `@JsonSerializable()` | `fromJson` / `toJson` 方法 | 🔲 待添加 |
一次 `build_runner build` 会**同时调度所有已配置的生成器**,全部 `.g.dart` 一次性生成。
## 三、涉及的模型文件
### Isar 模型(`@collection`)
| 文件 | 说明 |
|---|---|
| `lib/core/storage/models/question.dart` | 题目 |
| `lib/core/storage/models/wrong_question.dart` | 错题 |
| `lib/core/storage/models/answer_record.dart` | 答题记录 |
| `lib/core/storage/models/play_record.dart` | 播放记录 |
| `lib/core/version/app_version_entity.dart` | 版本信息实体 |
### json_serializable 模型(`@JsonSerializable`)
> 待引入后,纯接口 DTO 模型(如 `UserPointRecord`、`OssStsConfig` 等)将使用注解自动生成序列化代码,替代手写 `fromJson`。
## 四、使用命令
```bash
# 生成一次(推荐日常使用)
dart run build_runner build
# 清理旧产物后重新生成(遇到生成代码冲突时使用)
dart run build_runner build --delete-conflicting-outputs
# 监听模式:每次保存文件自动生成(开发阶段推荐)
dart run build_runner watch
```
## 五、什么时候需要跑
| 操作 | 是否需要跑 |
|---|---|
| Isar 模型加了/删了/改了字段 | ✅ 必须,否则编译报错 |
| `@JsonSerializable` 模型改了字段 | ✅ 必须,否则序列化字段对不上 |
| 只改了页面 UI / 业务逻辑 | ❌ 不需要 |
| 只改了 `pubspec.yaml` 依赖 | ❌ 不需要(跑 `flutter pub get` 即可) |
## 六、生成产物说明
- 生成文件命名:`xxx.g.dart`,和模型文件同目录
- 生成文件**必须提交到 Git**(`.gitignore` 里不要排除 `*.g.dart`)
- **不要手动编辑** `.g.dart` 文件,改了也会被下次生成覆盖
## 七、常见问题
### Q: 编译报错 `MissingStubError` 或 `is not a subtype of`
A: 模型字段改了但没跑 build_runner,重新生成即可。
### Q: 报 `AlreadyExistsException` 或 conflicting outputs
A: 加 `--delete-conflicting-outputs` 参数清理后重新生成。
### Q: 生成很慢怎么办
A: 开发阶段用 `watch` 模式,增量生成比每次全量 `build` 快很多。