Flutter Drawerコード

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メソッドがコールされなかったのでハマりました。)

後から考えると初歩的なことで「そりゃそうだわな」って思うのですが、ドツボにハマるとなかなか分からないもんですね。以後気をつけたいと思います。トホホ・・・

About The Author

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA