flutter-navigation について
既存の Flutter アプリでルーティングを実装・変更する開発者向けのナビゲーションスキルです。現状の構成を調べ、適切な方式を選び、関連する動作を検証します。
主な機能
- 01既存のルーティングと状態の調査
- 02要件に応じた Navigator / go_router の選択
- 03ルートデータとディープリンクの処理
- 04認証とナビゲーション動作の維持
- 05ルート変更のテストと検証
活用シーン
- 01詳細画面への遷移追加
- 02ディープリンクとブラウザー履歴の設定
- 03認証リダイレクトやネストしたタブの実装
- 04ナビゲーション変更とテストの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ madteacher/ mad-agents-skills --skill flutter-navigationインストール後、Claude Code で/flutter-navigationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/go_router_basic.dartnavigator_basic.dartpassing_data.dartreturning_data.dartreferences/deep-linking.mdgo_router-guide.mdnavigation-patterns.mdweb-navigation.md詳細
Flutter Navigation
Flutter のナビゲーション実装エージェントです。既存の状態、認証フロー、プラットフォームの想定を損なうことなく、ルートの状態、ブラウザーやディープリンクの動作、画面遷移を対象アプリに合わせることが役割です。
原則 0
ナビゲーションはユーザーの状態です。現在の MaterialApp、Router、Navigator、状態管理、認証、サポート対象プラットフォーム、テストを確認する前に、アプリのルーティングモデルを置き換えたり、ディープリンクに関する仕様を追加したりしないでください。ナビゲーションを変更した後は、Dart のアナライザーで問題がないことと、変更の影響を受けるルートの動作を検証してください。
ワークフロー
- 依頼の内容を特定します。単純な画面遷移、データの受け渡し、戻り値、ルートの移行、ディープリンクの設定、ウェブのブラウザー履歴、ネストされたタブやシェル、認証リダイレクト、ルートエラー処理、ナビゲーションテストのいずれかを確認します。
- コードを参照できる場合は、まずローカルの Flutter プロジェクトを調査します。
pubspec.yaml、lib/、アプリのルート、既存のルート定義、ナビゲーション呼び出し、認証/状態プロバイダー、プラットフォーム用フォルダー、ウェブのホスティング設定、関連テストを確認します。 - 要件を満たす最小限のルーティングモデルを選びます。
- シンプルなアプリのローカルで URL アドレス指定できないフローには、
NavigatorとMaterialPageRouteを使用します。 - ディープリンク、ウェブ URL、ブラウザー履歴、認証リダイレクト、ネストされたナビゲーション、複数の Navigator、拡張可能なルートテーブルには、
go_routerを使用します。 - 既存の小規模なアプリでレガシーの
MaterialApp.routes名前付きルートがすでに使われており、カスタムのディープリンク動作が不要な場合を除き、新たに導入するのは避けてください。
- シンプルなアプリのローカルで URL アドレス指定できないフローには、
- ルートデータを慎重に設計します。ローカルの Navigator による画面遷移ではコンストラクター引数を使い、URL アドレス指定が必要な識別情報にはパスパラメーターを、任意の URL 状態にはクエリパラメーターを使います。
extraは URL アドレス指定できないインメモリデータに限って使用します。 - アプリの既存のスタイルに沿って実装します。ユーザーから変更の依頼がない限り、安定した URL、ルート名、選択中のタブ状態、戻る動作、状態復元、分析用オブザーバー、認証リダイレクトのセマンティクスを維持します。
- 可能であれば、変更したルートの動作に関するテストを追加または更新します。依頼された変更に応じて、ルートの解析、リダイレクト、シェルやタブの選択、戻り値、見つからない場合やエラー時の画面をテストします。
- 利用できる範囲で最も確実なローカルチェックを実施します。ランタイム、デバイス、サーバー、ディープリンクの検証を省略した場合は、明示してください。
判断ガイド
| 必要なもの | デフォルトの方法 |
|---|---|
| 詳細画面を 1 つ開いて戻る | MaterialPageRoute<T> を使った Navigator.push<T> |
| 共有、ブックマーク、ブラウザーでのルート指定 | URL ベースのロケーションを使う go_router |
| 必須のリソース識別情報 | パスパラメーター。例:/users/:userId |
| 任意のフィルター、タブ、検索状態 | Uri(...).toString() を介したクエリパラメーター |
| 認証ゲートまたはオンボーディングゲート | アプリの認証状態に連動する go_router の redirect または onEnter |
| 永続的なナビゲーション用 UI | ShellRoute。各ブランチに独立したスタックが必要な場合は StatefulShellRoute を使用 |
| ウェブのパス URL | usePathUrlStrategy() と、index.html への SPA サーバーリライト |
| ネイティブの検証済みウェブリンク | Android App Links または iOS Universal Links と、ホストされた関連付けファイル |
| アプリ専用のカスタム URI | セキュリティとフォールバックのトレードオフを明示したカスタムスキーム |
リソースの振り分け
現在のタスクに必要なリソースだけを読み込んでください。
| タスク | 読み込む/使用するもの | 目的 |
|---|---|---|
| Navigator と go_router のどちらを選ぶか、またはルートに関するトレードオフを確認する | navigation-patterns.md | アプローチの比較、データの受け渡し、ブラウザー/ディープリンクの制限 |
| go_router のルートテーブル、リダイレクト、シェル、エラー、名前付きルート、ルートデータを実装または修正する | go_router-guide.md | 現在の go_router API と一般的な落とし穴 |
| Android App Links、iOS Universal Links、カスタムスキーム、ディープリンクのテストを設定する | deep-linking.md | プラットフォームの設定、関連付けファイル、Flutter ハンドラーに関する注意事項、テストコマンド |
| Flutter Web の URL、ブラウザー履歴、SPA のリライト、ルート以外へのホスティングを修正する | web-navigation.md | URL 戦略、サーバーのリライト、Web 固有の検証 |
| 最小限の Navigator スターターが必要 | navigator_basic.dart | クラス名とアプリシェルを調整してからコピーしてください |
| 最小限の go_router スターターが必要 | go_router_basic.dart | 依存関係を追加し、ルートを調整してからコピーしてください |
| Navigator でローカルデータを渡す必要がある | passing_data.dart | デモ用のモデル名と画面名を置き換えてからコピーしてください |
| Navigator で返却データを受け取る必要がある | returning_data.dart | null やキャンセルされた結果を適切に処理してからコピーしてください |
デフォルトでは、すべてのリファレンスを読まないでください。リファレンスは必要に応じて参照する詳細情報として、アセットは本番用モジュールではなくスターター例として扱ってください。
実装ルール
- 主なナビゲーションモデルを安易に混在させないでください。アプリで
go_routerを使用している場合、アプリの主要なルートにはcontext.go、context.push、context.goNamed、またはcontext.pushNamedを優先してください。意図的にディープリンクの対象としないローカルオーバーレイやフローに限り、命令型のNavigatorを使用してください。 - クエリ文字列を含むロケーションは、
Uri(path: ..., queryParameters: ...).toString()または go_router の名前付きルート API で構築してください。context.pushやcontext.goにqueryParameters引数を渡さないでください。 - クエリパラメーターは
state.uri.queryParametersから、パスパラメーターはstate.pathParametersから読み取ってください。 - 複雑な状態を URL だけに保存しないでください。ルート文字列を解析して検証し、ID や列挙型の値を安全に変換してください。また、値がない場合や無効な場合は、リダイレクト、エラー画面、フォールバック UI、または 404 の動作で処理してください。
- 更新、ブラウザーでの復元、共有、ネイティブのディープリンクを経ても保持する必要があるデータには
extraを使用しないでください。Web で複雑なextraが必要な場合は、コーデックを設定するか、データが失われる可能性を許容してください。 - 認証リダイレクトがループしないようにしてください。ログインやオンボーディングの後にユーザーを元のルートへ戻す場合は、戻り先を保持してください。
- iOS Universal Links では、
Info.plistのルートテーブルではなく、Xcode またはios/Runner/Runner.entitlementsで Associated Domains を設定してください。 - Web のパス戦略では、ルート以外のパスをホストする場合、
web/index.htmlの base href とサーバーのリライトを更新してください。対象のアプリがすでにその規約を採用している場合を除き、すべてのGoRoute.pathにホスティングのプレフィックスを含めないでください。 - アセットをそのままコピーしないでください。インポート、ルート名、キー、アプリシェル、パッケージバージョン、null 安全性、Lint、テストを対象プロジェクトに合わせて調整してください。
検証
Flutter プロジェクトを変更した後は、次の手順を実行してください。
- 編集した Dart ファイルに対して
dart formatを実行します。 - プロジェクトまたは最も近いパッケージに対して
flutter analyzeを実行します。 - ルートの解析、リダイレクト、シェル/タブの状態、返される結果、またはナビゲーション UI を変更した場合は、対象を絞った
flutter testスイートを実行します。 - Web の URL を変更した場合、可能であれば Chrome でアプリを実行し、変更したルートについて直接読み込み、更新、戻る、進む、見つからない場合の動作を確認します。
- ディープリンクについては、プラットフォームとデバイスが利用できる場合、
adb、xcrun simctl、または Flutter DevTools の Deep Links 検証を使って、対象の URL を正確にテストします。 - このスキルの Dart アセットのみを変更した場合は、必要な依存関係を含むスクラッチ Flutter アプリで検証した後、
dart format --output=none --set-exit-if-changedとflutter analyzeを実行します。
検証を実行できない場合は、コマンド、阻害要因、未検証のままのルート動作を報告してください。静的な読み取りだけを根拠に、ナビゲーション、ブラウザー履歴、またはディープリンクの動作を検証済みとして示さないでください。
フォールバック
対象のプロジェクトを利用できない場合は、ユーザーから提供されたファイルのみに基づいてルート計画またはパッチの概要を提示し、未実施の検証を明示してください。アプリにすでに一貫性のないルーティングモデルがある場合は、まず元に戻せる最小限の修正を行い、その後、ルーティング全体を置き換えるのではなく、段階的な移行を提案してください。