关于 flutter-drift
面向 Flutter 应用开发者的 Drift 本地持久化实现技能,指导检查项目结构、编写数据库代码、生成代码并验证迁移。
主要功能
- 01先检查应用架构与数据库
- 02按任务读取相关参考资料
- 03指导表、查询与写入实现
- 04覆盖迁移及生成代码流程
- 05运行格式化、分析和测试
适用场景
- 01为 Flutter 应用添加 Drift 存储
- 02修复已有 Drift 数据库代码
- 03调整数据表并安全迁移
- 04将 Drift 数据流接入 Flutter UI
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ madteacher/ mad-agents-skills --skill flutter-drift安装后在 Claude Code 中输入/flutter-drift确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/flutter-ui.mdmigrations.mdqueries.mdsetup.mdstreams.mdtables.mdwrites.md详细介绍
Flutter Drift
使用此技能在 Flutter 应用中添加或修复基于 Drift 的本地持久化。此技能是一套操作流程:先检查目标应用,只选择相关的参考文件,使用当前 Drift API 实现,并验证生成的代码。
核心工作流程
- 编辑前检查应用:
- 检查
pubspec.yaml、现有数据库文件、build.yaml、状态管理包、目标平台和测试。 - 优先采用应用当前的架构和命名,而不是此技能中的示例。
- 检查
- 使用包管理命令添加或确认依赖项,而不是硬编码版本:
dart pub add drift drift_flutter path_provider dev:drift_dev dev:build_runner- 仅当应用已在使用
provider或flutter_riverpod,或用户要求集成时,才添加这些依赖。
- 创建或更新数据库入口:
- 在 Dart 或
.drift文件中定义表。 - 将表添加到
@DriftDatabase。 - 除非项目需要自定义执行器,否则使用
package:drift_flutter/drift_flutter.dart中的driftDatabase打开 Flutter 数据库。
- 在 Dart 或
- 将 Drift 调用限定在数据库对象上:
- 在组件、服务和仓库中使用
database.select(database.todoItems)、database.into(database.todoItems)、database.update(database.todoItems)和database.delete(database.todoItems)。 - 仅在
GeneratedDatabase子类或DatabaseAccessor类中使用裸调用select(todoItems),这些类中的方法和表 getter 才在作用域内。
- 在组件、服务和仓库中使用
- 更改 Drift 声明后生成代码:
- 运行
dart run build_runner build。 - 将生成器错误视为阻塞问题,不要当作可选的清理项。
- 运行
- 对现有应用中的架构更改,使用 Drift 的引导式迁移工作流程:
- 在
build.yaml中配置drift_dev数据库。 - 根据需要,在架构更改前后运行
dart run drift_dev make-migrations。 - 递增
schemaVersion、编写生成的逐步迁移,并运行生成的迁移测试。
- 在
- 完成前进行验证:
- 对已编辑的 Dart 文件运行
dart format。 - 对包运行
flutter analyze或dart analyze。 - 运行针对性测试;如果更改了迁移,还要运行生成的迁移测试。
- 对已编辑的 Dart 文件运行
资源路由
- 添加 Drift、打开数据库、配置 Web 支持或跨 isolate 共享数据库时,阅读 references/setup.md。
- 定义表、列、默认值、键、索引、约束、生成列或严格表时,阅读 references/tables.md。
- 实现查询、筛选、排序、分页、联接、聚合、子查询、自定义列或并集时,阅读 references/queries.md。
- 实现插入、更新、删除、upsert、companion、事务或批量操作时,阅读 references/writes.md。
- 实现响应式 Drift 流、StreamBuilder、StreamProvider、自定义查询流、表更新监听器或手动流失效时,阅读 references/streams.md。
- 涉及
schemaVersion、现有用户数据、build.yaml、make-migrations、生成的架构文件或迁移测试时,阅读 references/migrations.md。 - 使用 Provider、Riverpod、StreamBuilder、搜索、筛选、分页,或面向用户的加载和错误状态,将 Drift 数据接入 Flutter 组件时,阅读 references/flutter-ui.md。
必需的 API 规则
- 不要在 widget 中将
select(database.table)作为顶层函数调用。在数据库类外部使用database.select(database.table)。 - 不要使用
watch(...)、todoUpdates(...)或notifyTableUpdates(...)。请使用customSelect(...).watch()、tableUpdates(...)和notifyUpdates(...)。 - 不要调用
delete(table).go(id)。添加where子句后再调用go(),或者使用项目中已有的生成式表扩展辅助方法。 - 不要使用
batch.updateAll(...),也不要将原始 ID 传给batch.delete(...)。请使用batch.update(..., where: ...)、传入可插入行的batch.delete(...),或batch.deleteWhere(...)。 - 不要混用 Provider 和 Riverpod API。
Provider.of<AppDatabase>(context)属于provider;Provider<AppDatabase>((ref) { ... })和AsyncValue.when(...)属于 Riverpod。 - 没有针对现有数据库的迁移计划时,不要提高
schemaVersion。 - 当 UI 流必须更新时,不要依赖原始 SQLite 写入。请使用 Drift 写入 API,或通过显式的
TableUpdate元数据调用notifyUpdates。
后备方案
- 如果软件包下载受阻,请更新源文件,并为用户留下准确的
dart pub add或flutter pub add命令,然后说明依赖解析未经验证。 - 如果项目无法运行
build_runner,不要手动编写生成的*.g.dart文件。请修复源声明并报告生成器受阻的情况。 - 如果迁移状态不明确,请在更改
schemaVersion前停止;询问当前已发布的架构历史或数据库文件。 - 如果需要支持 Web,但缺少
sqlite3.wasm和drift_worker.js,请添加相应代码路径,并明确报告所需的 Web 资源。
验证清单
pubspec.yaml包含 Drift 运行时和生成器依赖项。- 数据库文件包含有效的
part指令、表声明、@DriftDatabase、构造函数和schemaVersion。 - 所有查询和写入示例都限定在正确的数据库/访问器上下文中。
- 已使用
build_runner重新生成代码。 - Flutter UI 示例能够处理加载、空、错误和数据状态,且不会将
AsyncValue当作List。 - 只有在包含生成的架构快照、逐步迁移代码和测试时,才更改迁移。
- 对已编辑的软件包运行
flutter analyze或dart analyze并通过;若仍有分析器错误,则报告阻碍原因。
评论
支持 Markdown