navigation について
navigation は、GoRouter を使う Flutter アプリ向けにルーティングの指針を定めるスキルです。型安全な階層ルート、名前付きナビゲーション、ディープリンクに適したパラメーターを重視し、リダイレクトとテストも扱います。
主な機能
- 01GoRouter を使うナビゲーション規約
- 02生成ヘルパーを用いる型付きルート
- 03階層的なルート構成
- 04名前付きナビゲーションと URL パラメーター
- 05リダイレクトとウィジェットテストの指針
活用シーン
- 01型安全な Flutter ルートの追加
- 02戻る操作に沿った画面構成
- 03ディープリンクの設定とテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ verygoodopensource/ vgv-ai-flutter-plugin --skill navigationインストール後、Claude Code で/navigationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/parameters.mdredirects.mdtesting.mdtyped-routes.md詳細
ナビゲーション
Navigator 2.0 API を基盤とする、Flutter チーム推奨のルーティングパッケージ GoRouter を使った Flutter アプリケーションのルーティングとナビゲーションのベストプラクティスです。
基本基準
ナビゲーションに関するすべての作業で、以下の基準を適用します。
- すべてのナビゲーションに
package:go_routerを使います — Navigator 2.0 や Navigator 1.0 のpush/popを直接使わないでください - 型安全なルートには
@TypedGoRouteアノテーションを使います — ルート定義で文字列パスを直接使わないでください push()よりgo()を優先します — 遷移先からの戻り値が必要な場合に限りpush()を使いますextraパラメーターは使わないでください — ディープリンクが機能しなくなり、ウェブでも動作しません- 適切な戻るナビゲーションのために階層化されたサブルートを使います — ルートをフラットなリストではなく、親子ツリーとして構成します
- URL の単語の区切りにはハイフンを使います — URL パスにアンダースコアやキャメルケースを使わないでください
- 生のパス文字列ではなく、ルート名でナビゲートします — 名前付きルートナビゲーションを使い、パスの変更から切り離します
- ナビゲーションには
BuildContextの拡張メソッドを使います —GoRouter.of(context).goNamed()よりcontext.goNamed()を優先します
ルートの構成
論理的な親子関係を持つ階層構造でルートを構成します。サブルートを使うと、アプリバーの戻るボタンが正しく表示され、URL もすっきりと保てます。
階層構造(推奨)
/flutter
/flutter/news
/flutter/chat
/flutter/articles
/flutter/articles?category=all
/flutter/article/:id
/android
/android/news
/android/chat
フラットな構造(非推奨)
/flutter-news
/flutter-chat
/android-news
/android-chat
階層化されたサブルートを使うと、戻るナビゲーションが自動的に適切に設定されます。たとえば、ユーザーが /flutter/news にいる場合、戻るボタンで /flutter に移動します。
型安全なルート
すべてのルートは GoRouteData クラスで表し、@TypedGoRoute アノテーションを付与します。文字列パスを直接使わないでください。サブルートは親の routes: リスト内にネストすることで、上記の階層構造が型システムで表現され、package:go_router_builder がナビゲーションヘルパーを生成します。
基本的なルート、ネストされたサブルート、シェルルートについては、references/typed-routes.md を参照してください。
ナビゲーションメソッド
go() と push() の比較
| メソッド | URL の更新 | 戻るボタン | 用途 |
|---|---|---|---|
go() | はい | アプリバー | 画面間の標準的なナビゲーション |
push() | いいえ | システム | ポップされたルートからの戻り値が必要な場合 |
go() の使用(デフォルト)
const CategoriesPageRoute(size: 'small', color: 'blue').go(context);
go() を使うと、現在のルートに戻るための親ルートがある場合、アプリの AppBar に戻るボタンが表示されます。
push() の使用(戻り値が必要な場合のみ)
final result = await DialogPageRoute().push<String>(context);
ルートから戻り値を取得する必要がある場合(例:ユーザー入力を収集するダイアログ)に限り、push() を使います。ウェブでは、push() を使ってもアドレスバーは更新されません。
BuildContext の拡張メソッド
より簡潔な構文にするため、常に拡張メソッドを使います。
// Preferred
context.goNamed('flutterNews');
// Avoid
GoRouter.of(context).goNamed('flutterNews');
パラメーターの方針
リソースの識別にはパスパラメーター(:id)を使い、任意のフィルタリングにはクエリパラメーター(?category=all)を使います。extra は使わないでください。ディープリンクが機能しなくなり、ウェブでも動作しません。
パスパラメーター、クエリパラメーター、および extra が禁止されている理由の詳しい例については、references/parameters.md を参照してください。
リダイレクト
リダイレクトはルートルーターのレベル(例:認証ガード)と個々のルートのレベル(例:認可ガード)で適用できます。親のリダイレクトは子のリダイレクトより先に実行されます。
ルートレベルおよび個別ルートレベルのリダイレクト例については、references/redirects.md を参照してください。
テスト
package:mocktail で GoRouter をモックし、ウィジェットテストではウィジェットを InheritedGoRouter でラップします。リダイレクトをテストするには、対象のリダイレクトロジックを持つ GoRouter を構築し、結果のページを検証します。
GoRouter のモック方法とリダイレクトのテスト例については、references/testing.md を参照してください。
よく使われるパターン
新しいルートの追加
- ページウィジェットを作成します(Bloc を使用する場合は、Page/View パターンに従います)。
@TypedGoRouteアノテーションを付けたGoRouteDataクラスを定義します。- 適切な親ルートのサブルートとして追加します。
dart run build_runner build --delete-conflicting-outputsを実行して、ルートヘルパーを再生成します。- 生成された型安全なルートクラスを使って移動します。
ディープリンクの設定
- 意味のある URL パスを使って、ルートを階層的に構成します。
- リソースの識別にはパスパラメーターを使用します。
- フィルタリングにはクエリパラメーターを使用します。
extraは決して使用しないでください。 - ルート名で移動し、パスの再構成によってリンクが壊れないようにします。
- 対象の URL を使ってアプリを起動し、ディープリンクをテストします。
追加リソース
- references/parameters.md — パスパラメーター、クエリパラメーター、および
extraが禁止されている理由 - references/redirects.md — ルートレベルおよびルート単位のリダイレクト例
- references/typed-routes.md — 基本ルート、ネストされたサブルート、シェルルート
- references/testing.md —
GoRouterのモック化とリダイレクトのテスト