Flutter Drawerコード
下記のようなコードで画面遷移するのですが、ViewModelなどを使ってHandlerを別に用意してあったりすると、画面遷移しないことがあります。
onPressed: () {
// ここにボタンを押した時に呼ばれるコードを書く
Navigator.push(
context,
MaterialPageRoute(builder: (context) => NextPage()),
);
}
色々ググってみると「contextが見つからないから上にBuilderが必要」とか書かれていますが、いまいちピンと来なかったです。
私がハマったのはDrawerメニューの1つをタップすると別画面に遷移するという状況だったのですが、予めメニューとイベントハンドラーを別で定義していて、onTapではイベントハンドラーを呼び出すだけにしていました。
onTap: () {
if (dtoList[index].eventHandler != null) {
dtoList[index].eventHandler!(context);
}
// ドロワーを閉じる
Navigator.pop(context);
}
イベントハンドラーではURLでWebサイトに飛んだり、バージョン情報をダイアログで表示したりしていましたが、後で画面遷移するメニューを1つ追加になりました。
そのイベントハンドラー内でNavigator.pushで遷移していたのですが、メニューをタップしても反応なしで「なんでNavigator.pushで遷移しないの?」ってハマったという話です。
結局どうしたかというと、下記のようにしただけで正常に遷移してくれました。
onTap: () {
// ドロワーを閉じる
Navigator.pop(context);
if (dtoList[index].eventHandler != null) {
dtoList[index].eventHandler!(context);
}
}
イベントハンドラー処理前にドロワーを閉じるようにしただけです。
実際にはNavigator〜は非同期で実行するので、画面遷移しても「ドロワーを閉じる」の「Navigator.pop」で閉じていたというのが実態だったようです。(デバッガーのステップ実行でもScreenが呼ばれてるのに、Screenクラス内のbuildメソッドがコールされなかったのでハマりました。)
後から考えると初歩的なことで「そりゃそうだわな」って思うのですが、ドツボにハマるとなかなか分からないもんですね。以後気をつけたいと思います。トホホ・・・
