TL;DR
Flutterにて、Navigator.of(context)
としてウィジェットを遷移するために、いつでもどこでも参照できる最新のBuildContext
を保持した変数が欲しかった。
⇒ MaterialApp
のnavigatorKey
はどこからでも参照できる様子なので、main()
でrunApp
するとき、大本となるMaterialApp
のnavigatorKey
にGlobalKey<NavigatorState>
を渡してnavigatorKey.currentState!
から最新のBuildContextを参照する。
いきさつ
ログイン情報を監視するために FirebaseAuth.instance.authStateChanges().listen()
で状態の変化を監視して、ログインしてなかった場合ログインウィジェットへ遷移させようとしていた。ただしログインページへ遷移するためにNavigator.of(context)
とする必要があるのでBuildContext
が必要になる。Listenerに最新の画面遷移をさせるためには、最新のBuildContext
を与えたいので、最新のBuildContext
が毎度毎度更新される何かしらのクラスのインスタンスを渡す必要があるな、となった。
MaterialApp
にnavigatorKey
というメンバがあるらしく、こいつにGlobalKey<State>
のインスタンスを与えておけば、navigatorKey.currentState!
としていつでもどこでもアプリのWidigetのスコープ内であれば最新のBuildContext
が取得できるんだとか (Globalに宣言するから←多分重要)。
GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( navigatorKey: navigatorKey, home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('My App'), ), body: Center( child: ElevatedButton( onPressed: () { // グローバルキーを使用してWidget遷移 navigatorKey.currentState!.push(MaterialPageRoute( builder: (context) => SecondPage(), )); }, child: Text('Go to Second Page'), ), ), ); } } class SecondPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Second Page'), ), body: Center( child: Text('This is the second page.'), ), ); } }