【ITニュース解説】Understanding Flutter GoRouter for Beginners
2025年09月14日に「Dev.to」が公開したITニュース「Understanding Flutter GoRouter for Beginners」について初心者にもわかりやすく解説しています。
ITニュース概要
GoRouterはFlutterアプリの画面遷移をシンプルにするツールだ。URLベースで直感的にルートを定義でき、Webサイトのようにナビゲーションを扱える。Flutter標準のNavigatorより簡単で、初心者にも扱いやすく、パラメータ渡しやリダイレクトなど多機能だ。
ITニュース解説
Flutterアプリでの画面遷移を、よりシンプルかつ強力に実現するためのツールとして、「GoRouter」というパッケージが存在する。これはFlutterチームによって開発されており、特にシステムエンジニアを目指す初心者にとって、複雑になりがちなナビゲーション(画面間の移動)の管理を大幅に簡単にしてくれるものだ。
従来のFlutterのナビゲーション機能は、柔軟性が高い一方で、画面の履歴(スタック)を自分で管理する必要があり、初心者には少しとっつきにくいと感じられることがあった。GoRouterは、この問題を解決するために、ウェブサイトのように「URL」の考え方を使って画面遷移を定義する。例えば、ウェブサイトで「/home」や「/profile/123」といったURLにアクセスすると特定のページが表示されるように、Flutterアプリでも同じようにパスを定義し、それに従って画面を切り替えることができる。このURLベースのアプローチは、直感的で理解しやすく、アプリの規模が大きくなっても管理しやすいという大きなメリットがある。
GoRouterを使う利点は多い。まず、コードが非常にシンプルになる。画面遷移の定義が分かりやすい構文で記述できるため、アプリの構造を把握しやすい。次に、URLベースのナビゲーションは、ウェブアプリの開発にも非常に相性が良く、「ディープリンク」(外部からのURLでアプリの特定の画面を開く機能)の実装も容易にする。さらに、画面の中に別の画面のセットがあるような「ネストされたルート」(例えば、設定画面の中に「通知設定」や「プライバシー設定」のタブがあるような構造)も簡単に作れる。画面間でデータを渡す際も、URLのパスに直接IDなどのパラメータを含めることが可能だ。例えば、「/product/42」のようにすれば、商品IDが42の商品詳細画面を表示できる。また、ユーザーがログインしているかどうかに応じて、ログインページに自動的にリダイレクト(転送)させるような複雑なナビゲーションロジックも組み込みやすい。このように、GoRouterは画面遷移の管理に関する多くの課題を解決し、初心者でも迷うことなくナビゲーションを実装できるように設計されている。
実際にGoRouterをアプリに導入する手順を見てみよう。まずは、FlutterプロジェクトにGoRouterパッケージを追加する必要がある。これは、プロジェクトの「pubspec.yaml」というファイルを開き、依存関係(dependencies)の項目に「go_router: ^バージョン番号」といった行を追加するだけだ。追加後、ターミナルで「flutter pub get」コマンドを実行すると、インターネット経由で必要なパッケージがダウンロードされ、プロジェクトでGoRouterが使えるようになる。バージョン番号は常に最新のものを利用するのが良いだろう。
次に、実際に画面(スクリーン)を作成する。例えば、「HomeScreen」と「ProfileScreen」という二つの画面を用意する。HomeScreenはアプリの入り口となる画面で、ProfileScreenはユーザーのプロフィールを表示する画面である。これらの画面はFlutterのWidgetとして、通常のDartファイルに記述する。ProfileScreenでは、後ほど説明するユーザーIDを受け取れるように設計しておく。
これらの画面が用意できたら、いよいよGoRouterの設定を行う。アプリのメインとなる「main.dart」ファイルでGoRouterのインスタンスを生成し、アプリのルート(出発点)と画面遷移のルールを定義する。
具体的には、GoRouterの設定内で「routes」というリストに、各パスとそれに対応する画面を紐付ける。例えば、パスが「/」(ルート)であればHomeScreenを表示し、パスが「/profile/:userId」であればProfileScreenを表示するように定義する。ここで「:userId」と記述している部分は、URLから動的にデータを受け取るためのプレースホルダで、例えば「/profile/123」とアクセスされたら「123」という値がuserIdとしてProfileScreenに渡される仕組みだ。
アプリの全体を構築する際には、通常の「MaterialApp」ではなく、「MaterialApp.router」というWidgetを使用する。これにより、GoRouterがアプリ全体のナビゲーションを管理するようになる。GoRouterの設定で定義したルーティング情報(通常は_routerという変数に格納した設定)をrouterConfigプロパティに渡せば、準備は完了する。
これでナビゲーションの仕組みが整ったので、HomeScreenからProfileScreenへ実際に移動するコードを追加する。HomeScreenのボタンが押された時に、「context.go('/profile/123')」というコードを実行するように変更する。context.go()はGoRouterを使って特定のパスに移動するための命令であり、ここではユーザーID「123」を指定してProfileScreenへ遷移させている。ProfileScreenでは、この渡された「123」というユーザーIDを表示することができる。
アプリを実行すると、HomeScreenが表示され、ボタンをクリックすると「Profile Screen for User 123」と表示されたProfileScreenに移動する様子を確認できるはずだ。
GoRouterの主要な機能は、他にもいくつかある。
一つは、画面間のナビゲーションだ。先ほどのcontext.go()を使えば、指定したパスに移動できる。例えば、context.go('/profile/456')と書けば、ユーザーID「456」のプロフィール画面に移動できる。
もう一つは、前の画面に戻る機能だ。これは非常に簡単で、context.pop()というコードを呼び出すだけで、一つ前の画面に戻ることができる。ProfileScreenに「戻る」ボタンを設置し、そのボタンが押されたときにcontext.pop()を実行するように設定すればよい。
パラメータの受け渡しについては、既にURLパスに「:userId」を含める方法を説明したが、GoRouterは画面を構築する際に渡されるstateオブジェクトのstate.pathParameters['キー名']という形で、そのパラメータの値を取得できる。
さらに、ネストされたルートもGoRouterの強力な機能の一つだ。例えば、ダッシュボード画面の中に「設定」タブがあるような場合、「/dashboard」という親ルートの下に「settings」という子ルートを定義できる。これにより、「/dashboard/settings」というパスで設定画面にアクセスできるようになり、より構造的なナビゲーションを簡単に実現できる。
リダイレクト機能も非常に便利だ。ユーザーがまだログインしていない場合、どの画面にアクセスしようとしても自動的にログイン画面に転送する、といったロジックをGoRouterに組み込むことができる。GoRouterのインスタンスを定義する際にredirectというプロパティを設定し、そこで条件を記述する。例えば、ログイン状態をチェックし、未ログインでログインページ以外の画面にアクセスしようとした場合は、ログインページへのパスを返すようにすれば、自動的にリダイレクトが行われる。
システムエンジニアを目指す初心者へ向けて、GoRouterを使いこなすためのヒントをいくつか挙げる。まずは、今回説明したような基本的なルート設定から始めることだ。複雑なネストやリダイレクトは、基本を理解してから挑戦すると良いだろう。次に、ルートのパス名には「/home」や「/profile」のように、その画面の内容がわかるような説明的な名前を付けることを心がける。これにより、コードの可読性が向上し、他の開発者が見ても理解しやすくなる。そして、最も重要なことの一つは、必ずナビゲーション機能をテストすることだ。特にパラメータの受け渡しやリダイレクトのような条件分岐は、意図通りに動作するかを何度も確認する必要がある。困ったときは、公式のGoRouterドキュメントを読むことが解決への近道となる。
GoRouterは、Flutterアプリ開発において画面遷移の概念を簡素化し、効率的な開発をサポートしてくれる強力なツールである。これらの基本を理解し、実際に手を動かして試すことで、その便利さを実感できるだろう。