flutter-drift
DriftをFlutterアプリに導入・修正・レビュー・移行・テスト・デバッグするスキルで、SQLiteや`drift_flutter`を使った型安全なDartクエリ、生成テーブル、`StreamBuilder`またはRiverpod `StreamProvider`によるUI連携、書き込み操作、トランザクション、スキーママイグレーション、Webアセット、isolate共有、ローカルDBテストに対応します。Flutterのタスクでdrift・ローカルDBストレージ・SQLite・リアクティブDBストリーム・CRUD・`schemaVersion`・`build_runner`・`drift_dev` make-migrations・マイグレーションテスト、またはモバイル/Web/デスクトップ向けのDB構築が話題になった際に使用してください。
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.
SKILL.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)を使用します。 - メソッドとテーブルゲッターがスコープ内にある
GeneratedDatabaseサブクラスまたはDatabaseAccessorクラス内でのみ、ベアのselect(todoItems)を使用します。
- ウィジェット、サービス、リポジトリから
- 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を読みます。 - 挿入、更新、削除、アップサート、コンパニオン、トランザクション、またはバッチ操作を実装する場合は
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(...)を使用したり、batch.delete(...)に未処理 id を渡さないでください。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をリストとして扱わずに、ローディング、空、エラー、およびデータ状態を処理しています。 - マイグレーションは、生成されたスキーマスナップショット、ステップバイステップマイグレーションコード、およびテストのみで変更されました。
- 編集されたパッケージに対して
flutter analyzeまたはdart analyzeが成功するか、残存するアナライザーエラーがブロッカーとともに報告されています。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- madteacher
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/madteacher/mad-agents-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。