Skip to main content
skill CX Codex

flutter-drift — Claude Code skill for Drift and SQLite in Flutter

Walks the agent through Drift persistence in Flutter: tables, queries, reactive streams, schema migrations and tests. Useful whether the app already has a local database or you are adding one.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add MADTeacher/mad-agents-skills --skill flutter-drift -a claude-code
Open on GitHub

What flutter-drift does

This skill is a workflow, not a snippet dump. The agent inspects pubspec.yaml, existing database files, build.yaml, the state management package, target platforms and tests before touching anything. Dependencies go in through dart pub add drift drift_flutter path_provider dev:drift_dev dev:build_runner, so no versions get hardcoded. provider or flutter_riverpod are added only when the app already uses one or you ask for it.

Then comes the code: tables in Dart or .drift files, @DriftDatabase, opening the database with driftDatabase from package:drift_flutter/drift_flutter.dart. Calls like database.select(database.todoItems) stay scoped to the database object instead of floating at widget level. Any change to Drift declarations requires dart run build_runner build afterwards, and generator errors count as blockers.

Seven reference files get pulled in as needed: setup, tables, queries, writes, streams, migrations, flutter-ui. There is also a list of calls to avoid. watch(...) and notifyTableUpdates(...) are out; customSelect(...).watch() and notifyUpdates(...) are in. One rule is absolute: never bump schemaVersion without a migration plan for databases already in users' hands. If the schema history is unclear, the skill stops and asks rather than guessing. Web builds need sqlite3.wasm and drift_worker.js — without them the agent writes the code path and tells you which assets are missing.

What it helps with

  • set up a Drift local database in a fresh Flutter project
  • fix a failing build_runner run after editing tables
  • replace deprecated watch and notifyTableUpdates calls with current APIs
  • write a schema migration without wiping user data
  • pipe database rows into a widget through StreamBuilder or Riverpod

Example prompts for the agent

  • Add a Drift local database to this project with a tasks table: id, title, done
  • The schema changed — bump schemaVersion and write a migration with a test
  • The task list should refresh itself on every write; wire the stream into the widget

How to install flutter-drift

1Skills CLI (Vercel)

npx skills add MADTeacher/mad-agents-skills --skill flutter-drift -a claude-code

2Manually: put the files in place

~/.claude/skills/flutter-drift/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/flutter-drift/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about flutter-drift

How do I install flutter-drift in Claude?

Run npx skills add MADTeacher/mad-agents-skills --skill flutter-drift -a claude-code. The skill lands at ~/.claude/skills/flutter-drift/SKILL.md.

What does flutter-drift do?

It guides the agent through the whole Drift cycle: dependencies, tables, queries, writes, reactive streams, migrations and tests. It also lists the API calls you should not use.

Does web support need extra files?

Yes — web builds require sqlite3.wasm and drift_worker.js. If they are missing, the skill adds the code path and reports which assets to supply.

Source text

SKILL.md · MIT
---
name: flutter-drift
description: Implement, fix, review, migrate, test, or debug Drift persistence in Flutter apps using SQLite, drift_flutter, type-safe Dart queries, generated tables, StreamBuilder or Riverpod StreamProvider UI, write operations, transactions, schema migrations, web assets, isolate sharing, and local database testing. Use when a Flutter task mentions drift, local database storage, SQLite, reactive database streams, CRUD, schemaVersion, build_runner, drift_dev make-migrations, migration tests, or Flutter-specific database setup across mobile, web, or desktop.
metadata:
  author: Stanislav [MADTeacher] Chernyshev
  version: "1.1"
---

# Flutter Drift

Use this skill to add or repair Drift-based local persistence in Flutter apps. The skill is an operating workflow: inspect the target app first, choose only the relevant reference files, implement with current Drift APIs, and validate generated code.

## Core Workflow

1. Inspect the app before editing:
   - Check `pubspec.yaml`, existing database files, `build.yaml`, state management package, target platforms, and tests.
   - Prefer the app's current architecture and naming over the examples in this skill.
2. Add or verify dependencies with package commands instead of hardcoding versions:
   - `dart pub add drift drift_flutter path_provider dev:drift_dev dev:build_runner`
   - Add `provider` or `flutter_riverpod` only when the app already uses it or the user asks for that integration.
3. Create or update the database entry point:
   - Define tables in Dart or `.drift` files.
   - Add the tables to `@DriftDatabase`.
   - Open Flutter databases with `driftDatabase` from `package:drift_flutter/drift_flutter.dart` unless the project needs a custom executor.
4. Keep Drift calls scoped to the database object:
   - Use `database.select(database.todoItems)`, `database.into(database.todoItems)`, `database.update(database.todoItems)`, and `database.delete(database.todoItems)` from widgets, services, and repositories.
   - Use bare `select(todoItems)` only inside `GeneratedDatabase` subclasses or `DatabaseAccessor` classes where the methods and table getters are in scope.
5. Generate code after changing Drift declarations:
   - Run `dart run build_runner build`.
   - Treat generator errors as blockers, not optional cleanup.
6. For schema changes in an existing app, use Drift's guided migration workflow:
   - Configure `drift_dev` databases in `build.yaml`.
   - Run `dart run drift_dev make-migrations` before and after schema changes as needed.
   - Bump `schemaVersion`, write generated step-by-step migrations, and run generated migration tests.
7. Validate before finishing:
   - Run `dart format` on edited Dart files.
   - Run `flutter analyze` or `dart analyze` for the package.
   - Run targeted tests, including generated migration tests when migrations changed.

## Resource Routing

- Read [references/setup.md](references/setup.md) when adding Drift, opening a database, configuring web support, or sharing a database across isolates.
- Read [references/tables.md](references/tables.md) when defining tables, columns, defaults, keys, indexes, constraints, generated columns, or strict tables.
- Read [references/queries.md](references/queries.md) when implementing selects, filters, sorting, pagination, joins, aggregations, subqueries, custom columns, or unions.
- Read [references/writes.md](references/writes.md) when implementing inserts, updates, deletes, upserts, companions, transactions, or batch operations.
- Read [references/streams.md](references/streams.md) when implementing reactive Drift streams, StreamBuilder, StreamProvider, custom select streams, table update listeners, or manual stream invalidation.
- Read [references/migrations.md](references/migrations.md) when `schemaVersion`, existing user data, `build.yaml`, `make-migrations`, generated schema files, or migration tests are involved.
- Read [references/flutter-ui.md](references/flutter-ui.md) when wiring Drift data into Flutter widgets with Provider, Riverpod, StreamBuilder, search, filtering, pagination, or user-facing loading and error states.

## Required API Rules

- Do not call `select(database.table)` as a top-level function from a widget. Use `database.select(database.table)` outside database classes.
- Do not use `watch(...)`, `todoUpdates(...)`, or `notifyTableUpdates(...)`. Use `customSelect(...).watch()`, `tableUpdates(...)`, and `notifyUpdates(...)`.
- Do not call `delete(table).go(id)`. Add a `where` clause and then call `go()`, or use generated table extension helpers if the project already uses them.
- Do not use `batch.updateAll(...)` or pass raw ids to `batch.delete(...)`. Use `batch.update(..., where: ...)`, `batch.delete(...)` with an insertable row, or `batch.deleteWhere(...)`.
- Do not mix Provider and Riverpod APIs. `Provider.of<AppDatabase>(context)` belongs to `provider`; `Provider<AppDatabase>((ref) { ... })` and `AsyncValue.when(...)` belong to Riverpod.
- Do not bump `schemaVersion` without a migration plan for existing databases.
- Do not rely on raw SQLite writes when UI streams must update. Use Drift write APIs or call `notifyUpdates` with explicit `TableUpdate` metadata.

## Fallbacks

- If package downloads are blocked, update source files and leave exact `dart pub add` or `flutter pub add` commands for the user, then state that dependency resolution was not validated.
- If a project cannot run `build_runner`, do not hand-write generated `*.g.dart` files. Fix source declarations and report the generator blocker.
- If migration state is unclear, stop before changing `schemaVersion`; ask for the current released schema history or database files.
- If web support is required but `sqlite3.wasm` and `drift_worker.js` are missing, add the code path and explicitly report the required web assets.

## Validation Checklist

- `pubspec.yaml` contains Drift runtime and generator dependencies.
- Database files have valid `part` directives, table declarations, `@DriftDatabase`, constructor, and `schemaVersion`.
- All query and write examples are scoped to the correct database/accessor context.
- Generated code was rebuilt with `build_runner`.
- Flutter UI examples handle loading, empty, error, and data states without treating `AsyncValue` as a `List`.
- Migrations changed only with generated schema snapshots, step-by-step migration code, and tests.
- `flutter analyze` or `dart analyze` passes for the edited package, or any remaining analyzer failure is reported with the blocker.

© Stanislav [MADTeacher] Chernyshev · MIT · MADTeacher/mad-agents-skills

Similar skills

Everything for Mobile →

From the same set10

flutter-adaptive-ui This skill guides agents through building adaptive Flutter interfaces for mobile and desktop screens. It bases layout changes on width constraints rather than OS checks. CX Codex +1 2,000installs flutter-architecture A skill that designs and reviews Flutter app architecture: layers, MVVM, feature-first layout, DI, and patterns like Result and Command. CX Codex +1 1,700installs flutter-testing A skill for writing, fixing and debugging Flutter tests: unit, widget and integration layers, mocks, golden checks. CX Codex +1 1,500installs flutter-networking A skill for Flutter network code: HTTP/REST, WebSocket, auth and token refresh, timeouts, retries, JSON parsing, caching. Useful when adding requests or chasing network errors. CX Codex +1 722installs flutter-navigation A skill that makes your coding agent handle Flutter navigation: Navigator, go_router, deep links, redirects and browser history. CX Codex +1 589installs flutter-internationalization Automates Flutter internationalization using gen-l10n and ARB files. Solves UI string extraction, RTL layout adjustments, and generated import errors. CX Codex +1 536installs dart-drift A skill for Drift persistence in Dart CLI, server-side and non-Flutter desktop apps: tables, queries, migrations, PostgreSQL. CX Codex +1 466installs agents-md-generator Writes and trims AGENTS.md at the repo root and in nested modules. Useful when agent instructions have grown bloated or contradict each other. CX Codex +1 377installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor