flutter-drift について
Flutter アプリ開発者向けに、Drift によるローカル永続化の追加や修正を支援するスキルです。既存構成を確認し、コード生成やマイグレーションを検証する手順を示します。
主な機能
- 01アプリ構成とデータベースの確認
- 02作業に応じた参考資料の選択
- 03テーブル・クエリ・書き込みの実装
- 04マイグレーションとコード生成
- 05フォーマット・解析・テストの実行
活用シーン
- 01Flutter アプリへの Drift 保存機能の追加
- 02既存 Drift データベースコードの修正
- 03テーブル変更と安全な移行
- 04Drift ストリームの 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_runnerproviderまたは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)を使用します。 select(todoItems)のように単独で呼び出すのは、メソッドとテーブルゲッターがスコープ内にあるGeneratedDatabaseのサブクラスまたはDatabaseAccessorクラス内に限ります。
- ウィジェット、サービス、リポジトリでは、
- 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 サポートの設定、または分離したアイソレート間でのデータベース共有を行う場合は、references/setup.md を読みます。
- テーブル、列、デフォルト値、キー、インデックス、制約、生成列、または厳密なテーブルを定義する場合は、references/tables.md を読みます。
- セレクト、フィルター、ソート、ページネーション、結合、集計、サブクエリ、カスタム列、またはユニオンを実装する場合は、references/queries.md を読みます。
- 挿入、更新、削除、アップサート、コンパニオン、トランザクション、または一括操作を実装する場合は、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 ルール
- ウィジェットからトップレベル関数として
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 API と 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 対応