【Flutter/Dart】Navigatorで画面遷移の実装方法!MaterialPageRoute

この記事からわかること
- Flutter/Dartの画面遷移の実装方法
- NavigatorやMaterialPageRoute/CupertinoPageRouteの使い方
- .of(context)とは?
- データを受け渡すには?
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Koala
- Xcode:16.0
- Flutter:3.29.2
- Dart:3.7.2
- Mac M1:Sonoma 14.6.1
Flutterのナビゲーション(画面遷移)
Flutterアプリにおけるナビゲーション(画面遷移)機能はスタック構造の仕組みで構築されており、スタック構造の遷移情報は基本的に後入れ先出し(LIFO: Last In First Out; FILO: First In Last Out)で操作されます。
ページAからページBに画面を遷移する際はスタックの中に遷移情報をプッシュし、ページBからページAに画面を遷移する(戻る)際はスタックの中の遷移情報をポップすることで画面を入れ替えます。

またFlutterの画面遷移の仕組みは画面をオーバーレイする(覆い被さる)形で表示するので遷移情報をポップせずに重ね続けるとメモリがオーバーフローしてしまうことがあるので注意が必要です。
Navigator
Flutterで画面遷移を実装するときはNavigator
とMaterialPageRoute
/CupertinoPageRoute
の2つのWidgetが必要になります。
NavigatorはFlutterの画面遷移(ナビゲーション)を管理するWidgetです。要は遷移情報をスタック構造に追加したり、削除したりすることが可能です。
メソッド | 説明 | 戻るボタンで戻れるかどうか |
---|---|---|
push() |
新しい画面を追加(現在のページの上に積む) | 戻れる |
pop() |
現在のページを削除(1つ前のページに戻る) | - |
pushReplacement() |
現在のページを新しいページで置き換える | 戻れない |
pushAndRemoveUntil() |
指定したページまで戻し、新しいページを追加 | 戻れない |
maybePop() |
戻れる場合にのみ `pop()` を実行 | 戻れる |
canPop() |
戻れるかどうかを `true / false` で返す | - |
popUntil() |
指定した条件を満たすまで `pop()` を実行 | 戻れる |
MaterialPageRoute / CupertinoPageRoute
MaterialPageRoute / CupertinoPageRoute
MaterialPageRoute/CupertinoPageRouteは画面遷移先の新しいページを作成するWidgetです。ページ遷移のアニメーション機能なども提供しており、それぞれAndroid/iOSのOSに合わせた遷移アニメーションを提供してくれます。基本的にはNavigator
を組み合わせて使用することで画面遷移機能を実装することができます。
画面遷移の実装方法
「ページAからページBに画面を遷移させる」機能を実装してみたいと思います。実装は簡単でボタンのアクション部分でpush
メソッドを使用して遷移ロジックを記述します。.of(context)
部分の役割は後述します。
// 画面をプッシュ
Navigator.of(context).push(
// 画面を構築
MaterialPageRoute(builder: (context) => const PageB()),
);
サンプルコード
class PageA extends StatelessWidget {
const PageA({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Page A")),
body: Center(
child: ElevatedButton(
child: const Text("Page B へ"),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => const PageB()),
);
},
),
),
);
}
}
画面を戻る
画面を遷移して表示された新しい画面から元の画面に戻りたい場合はpop
メソッドを呼び出します。Scaffold
/AppBar
を使用している場合はアプリバー(ヘッダー)部部分に自動で戻る「<」ボタンが表示されるので実装しなくても画面を戻る機能が実装されています。
class PageB extends StatelessWidget {
const PageB({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Page B")),
body: Center(
child: ElevatedButton(
child: const Text("戻る"),
onPressed: () {
Navigator.of(context).pop(); // Page A に戻る
},
),
),
);
}
}
データの受け渡し
Navigator
では遷移元と遷移先でデータの受け渡しが可能になっています。方法は簡単でpush
の呼び出し側ではawait
を使用して結果を待機させます。
final String? text = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PageB(),
),
);
print(text)
遷移先側ではpop
の引数に渡したいデータを渡すだけです。これでNavigator
を経由してデータの送受信が可能になります。
Navigator.of(context).pop("データを送るよ");
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。