Open2

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

muranakarmuranakar

主な違いについて説明します:

GlobalKey<NavigatorState>()の特徴:

  • Navigatorの状態を直接参照・操作できる
  • どこからでもナビゲーションが可能(コンテキスト不要)
  • アプリ全体で一意のキーとして機能
  • Widgetツリーの再構築時も状態を保持

onGenerateRouteの特徴:

  • ルーティングのロジックを集中管理できる
  • 動的なルート生成が可能
  • パラメータの受け渡しが柔軟
  • ルートの存在確認やエラーハンドリングが可能
muranakarmuranakar

重要なポイントを説明します:

  1. BuildContextを使用した状態参照:
// BuildContextからNavigatorStateを取得
final navigator = Navigator.of(context);
navigator.pushNamed(AppRouter.detail);
  1. onGenerateRouteでの処理:
MaterialApp(
  navigatorKey: _navigatorKey, // GlobalKeyの設定
  onGenerateRoute: (settings) {
    switch (settings.name) {
      case AppRouter.detail:
        return MaterialPageRoute(
          builder: (context) => DetailPage(),
          settings: settings,
        );
    }
  },
)
  1. 状態の同期:
// どちらの方法でも同じ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の処理は遷移方法に関係なく常に実行される