Flutter
のルーティング管理パッケージgo_router
について以下の内容について記述します。
- インストール方法
- 基本的な使い方
- 応用的な使い方
- 階層構造を持ったページを作りたい場合
- ページ遷移時にパラメータを渡したい
- エラー検知してエラーページを表示したい場合
パッケージのインストール
pubspec.yaml
のdependencies
にgo_router
を追加します。
dependencies:
+ go_router:
flutter pub get
でインストールします
$ flutter pub get
基本的な使い方
アプリケーションでの初期設定
lib/main.dart
でアプリケーションのrouter
にgo_router
を使用するように設定します
+ import 'package:go_router/go_router.dart';
class App extends StatelessWidget {
App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp.router(
+ routerDelegate: _router.routerDelegate,
+ routeInformationParser: _router.routeInformationParser,
+ routeInformationProvider: _router.routeInformationProvider,
);
}
+ final _router = GoRouter();
}
具体的な値としてはGoRouter()
の中にルーティングを追加していきます。
GoRouter()
の書き方
GoRouter()
の書き方は以下の通りです。
GoRouter(
name: 'top',
path: '/',
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: Top(),
),
)
-
path
にルーティングのパスを書きます -
name
にルーティングの名前を書きます- ルーティングを使用する際にフルパスではなく名前を指定することができるため名前を定義しておくことで呼び出し処理を簡潔にすることができます
-
pageBuilder
でページ描画処理を行います- 特別な処理を不要な場合
child
にclass
を指定するだけです
- 特別な処理を不要な場合
呼び出し方
ルーティングを呼び出したいclass
でgo_router
をimportしてcontext.go()
またはcontext.goNamed()
を使用します。
import 'package:go_router/go_router.dart';
context.go('/');
context.goNamed('top');
-
context.go()
を使用する場合はpath
で定義したルーティングのパスを引数に指定します -
context.goNamed()
を使用する場合はname
で定義したルーティングの名前を引数に指定します
応用的な使い方
階層構造を持ったページを作りたい場合
以下の画像のように左上に前のページに戻るボタンが設置されるような階層構造を作りたい場合
親ページにしたいルーティング定義でroutes
に子ページを配列で定義します。
GoRouter(
name: 'top',
path: '/',
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: Top(),
),
+ routes: [
+ GoRoute(
+ name: 'users',
+ path: 'users',
+ pageBuilder: (context, state) => MaterialPage(
+ key: state.pageKey,
+ child: Users(),
+ ),
+ ]
)
ページ遷移時にパラメータを渡したい場合
前述の階層構造があるルーティングで親ページから子ページに遷移する際にパラメータを渡したい場合
- ルーティングを使う側で
extra
引数に値を指定します。
context.goNamed('users', extra: 1);
-
state.extra
に値が格納されるのでルーティングの定義の中でchild
のclass
に渡すなど使用します
GoRouter(
name: 'top',
path: '/',
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: Top(),
),
routes: [
GoRoute(
name: 'users',
path: 'users',
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: Users(
+ user_id: state.extra! as String
),
),
]
)
エラー検知してエラーページを表示したい場合
GoRouter()
のerrorPageBuilder
でエラーページの定義をすることで行います。
state.error
にエラーオブジェクトが格納されます。
routes: [
GoRouter(
name: 'top',
path: '/',
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: Top(),
),
],
+ errorPageBuilder: (context, state) => MaterialPage(
+ key: state.pageKey,
+ child: Scaffold(
+ body: Center(
+ child: Text(state.error.toString()),
+ ),
+ ),
+ ),
)
ドキュメント
環境
- Flutter 2.10.4
- Dart SDK version: 2.16.2