Open2
GlobalKey<NavigatorState>()とonGenerateRouteを用いた画面遷移

主な違いについて説明します:
GlobalKey<NavigatorState>()の特徴:
- Navigatorの状態を直接参照・操作できる
- どこからでもナビゲーションが可能(コンテキスト不要)
- アプリ全体で一意のキーとして機能
- Widgetツリーの再構築時も状態を保持
onGenerateRouteの特徴:
- ルーティングのロジックを集中管理できる
- 動的なルート生成が可能
- パラメータの受け渡しが柔軟
- ルートの存在確認やエラーハンドリングが可能

重要なポイントを説明します:
- BuildContextを使用した状態参照:
// BuildContextからNavigatorStateを取得
final navigator = Navigator.of(context);
navigator.pushNamed(AppRouter.detail);
- onGenerateRouteでの処理:
MaterialApp(
navigatorKey: _navigatorKey, // GlobalKeyの設定
onGenerateRoute: (settings) {
switch (settings.name) {
case AppRouter.detail:
return MaterialPageRoute(
builder: (context) => DetailPage(),
settings: settings,
);
}
},
)
- 状態の同期:
// どちらの方法でも同じNavigatorStateにアクセス可能
// BuildContextから
final state1 = Navigator.of(context);
// GlobalKeyから
final state2 = _navigatorKey.currentState;
// state1 と state2 は同じインスタンスを参照している
assert(state1 == state2); // true
主な特徴:
- Navigator.of(context)は最も近いNavigatorStateを探索する
- 同じNavigatorStateインスタンスが共有される
- GlobalKeyとBuildContextの両方から同じ状態にアクセス可能
- onGenerateRouteの処理は遷移方法に関係なく常に実行される