Drift 类型安全数据库框架:Flutter 响应式本地存储为什么值得选

📅 2026/8/24 4:25:33
Drift 类型安全数据库框架:Flutter 响应式本地存储为什么值得选
Drift 类型安全数据库框架Flutter 响应式本地存储为什么值得选【免费下载链接】driftDrift is an easy to use, reactive, typesafe persistence library for Dart Flutter.项目地址: https://gitcode.com/gh_mirrors/dr/drift昨晚发版一台 Android 真机启动即崩。日志里是一句table todos has no column named compelted——一个拼错的列名在测试机、模拟器上都没暴露只在某个系统版本上走到这条查询路径才炸出来。这类 SQL 字符串错误往往要等用户先撞上你才后知后觉。Drift 是一个构建在 SQLite 之上的 Dart / Flutter 类型安全响应式数据库框架。适合需要跨平台本地持久化、又希望把数据库错误挡在编译期的 Flutter 应用。1 分钟跑起来装依赖、写最小数据库、确认生成在pubspec.yaml里加入运行时依赖与代码生成器dependencies: drift: any drift_flutter: any path_provider: any dev_dependencies: drift_dev: any build_runner: anydrift负责运行时读写drift_dev负责编译期生成类型安全的数据库代码。没有它下面的_$AppDatabase基类根本不存在。接着创建最小示例再执行dart run build_runner build生成database.g.dartimport package:drift/drift.dart; import package:drift_flutter/drift_flutter.dart; part database.g.dart; class Todos extends Table { IntColumn get id integer().autoIncrement()(); TextColumn get title text()(); BoolColumn get completed boolean().withDefault(const Constant(false))(); } DriftDatabase(tables: [Todos]) class AppDatabase extends _$AppDatabase { AppDatabase() : super(driftDatabase(name: app)); int get schemaVersion 1; }验证方式有三步生成器在database.dart旁输出database.g.dart说明表结构已被解析select(todos).get()返回的是Todo对象列表而非动态 Mapselect(todos).watch()插入一行后立刻推送新结果。三处都没报错就算跑通了。它凭什么好用把数据库错误挡在编译期表定义即类型写错查询当场报错表用 Dart 类声明每个 getter 对应一列列类型、可空性、默认值都写在声明里。Drift 的生成器据此产出行类与查询入口查询里引用不存在的列、传错参数类型分析器直接标红而不是等运行时抛异常。实现位于 drift/lib/src/runtime/生成逻辑在 drift_dev/lib/。相当于给数据库配了一位编译器守门员你拼错的列名还没进真机就已经被拦在门外了。任意查询都能变成自动更新的 StreamDrift 的核心设计是每个可执行查询都实现Selectable接口get()一次性取数watch()返回自动更新的流。底层机制是生成器预先记下查询涉及哪些表监听这些表上的写入有变动就重跑查询并推送新结果。跨表 join 的复杂查询同样支持。对 UI 层的好处是省掉手动刷新的胶水代码列表页订阅watch()数据一变界面自更新这正是它在 Flutter 里响应式的由来。详细说明见 docs/content/dart_api/streams.md。一套代码覆盖移动、桌面与 Web通过drift_flutter的driftDatabase()打开数据库原生端走 SQLite FFIWeb 端切换为 WASM 实现业务代码不变。仓库里的 examples/app/ 就是一个跨平台 Todo 示例Android、iOS、桌面、Web 端共用同一套表与查询定义。你不用为Web 版怎么存数据单独设计一套方案。更进一步迁移不丢数据的做法分步迁移drift_dev make-migrations命令会把每个历史版本的表结构导出成 JSON并生成database.steps.dart之后用stepByStep(from1To2: ..., from2To3: ...)逐级升级。即使某张表在源码中已被删掉对应版本的迁移代码依然可写可测老数据逐级迁移不丢失。examples/app/lib/database/database.dart 展示了一个真实用例加列、建触发器、alterTable重建约束。模块化拆分大型项目可以把表和查询拆进多个.driftSQL 文件用DriftDatabase的include参数聚合。examples/modular/ 演示了按用户帖子搜索切分后仍共享同一个数据库入口。DevTools 扩展App 运行时在 Flutter DevTools 中启用 Drift 扩展可直接查看表结构、修改数据还能比对实际 schema 与代码声明是否一致——测迁移时尤其好用。图 1在 DevTools 扩展列表里启用 Drift即可开始数据库调试图 2Drift 标签页中浏览数据库的表与数据学习路径按这个顺序读不容易卡住官方文档docs/content/ 下按主题组织先读 docs/content/setup.md 完成搭建再进 docs/content/dart_api/ 逐篇了解表、行、流查询。示例工程examples/ 覆盖了跨平台应用、多包结构、Web Worker、加密等场景不确定某个特性能不能用时先在这里找现成答案。迁移参考docs/content/migrations/ 专门讲 schema 变更配合 drift/lib/internal/migrations.dart 的源码理解MigrationStrategy的执行时机。问题反馈搭建或使用时卡住可以在仓库提 issue / discussion 求助drift/test/ 下的大量集成测试也常是特性用法的活教材。适合谁用如果你的 Flutter 应用需要本地持久化、查询会随业务变复杂、且希望把 SQL 错误挡在编译期Drift 值得进短名单类型安全和 watch 流这两点正好对上 Flutter 的开发节奏。若项目只是轻量键值存取或纯服务端存储它反而偏重了。现在就克隆 https://gitcode.com/gh_mirrors/dr/drift 把 examples/app 跑起来看看你的待办列表能不能十分钟内变成一条自动更新的 Stream。【免费下载链接】driftDrift is an easy to use, reactive, typesafe persistence library for Dart Flutter.项目地址: https://gitcode.com/gh_mirrors/dr/drift创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考