[Flutter] showDialogをルートWidgetで呼ぶ方法

例えば、アプリ内の各画面遷移時やバックグラウンドから復帰時にアプリアップデートが必要かを調べ、必要な場合に強制アップデートダイアログを出す場合とかにルートでダイアログを使いたくなる。

ポイントは2点

1. MaterialApp Widget内でshowDialogする

https://stackoverflow.com/questions/53294551/showdialog-from-root-widget

MaterialAppでBuildContextが暗黙的に生成されるので、その中でshowDialogしないとcontextが無くエラーになる。

2. Future.delayedでshowDialogする

https://stackoverflow.com/questions/52059024/show-dialog-on-widget/52062540#52062540

StateNotifierとかChangeNotifierでStateを判定 → その結果に基づいてshowDialogしたりしている場合、ただshowDialogしてもエラーになる。 (1.と同様の理由?)

記事のように、即時実行でなくFuture.delayedを使って処理を後ろに回してshowDialogすると正常に動作する。

State変更によるWidget再構築によってBuildContextが一時的に消失するのが原因かな?とは思っている。

実際の実行サンプル(https://coneta.jp/article/show/2923)