Flutter

Flutter でネイティブ画面から戻った直後に Navigator を使うと固まる?

Flutter でアプリを開発していて、プラットフォーム・ネイティブの画面を使うことがあります。たとえば画像ピッカーだったり、WebViewだったり、Twitterなどのソーシャル連携だったりです。

ネイティブの画面から戻ったあとで、その結果を使って何らかの画面遷移をしたい場合がありますが、即座に Navigator を操作すると、問題が発生することがあります。

https://github.com/flutter/flutter/issues/13818

Issue にあるように、以下のようなワークアラウンドで回避することができます。

var imageFile = await ImagePicker.pickImage();

await new Future.delayed(new Duration(milliseconds: 100));
Navigator.of(...).push(...)


なお、時間を待つ実装がダサくて嫌だという場合は WidgetsBindingObserver を使って、Flutter 画面が前面にいる AppLifecycleState.resumed 状態になることを待ってから遷移すれば OK です。

いわゆる「処理中」のダイアログの表示で、その処理がアプリがバックグラウンドにいる間に終わると、上記の Issue に関連してダイアログが閉じないという問題に遭遇したのでライブラリを作りました。

https://github.com/najeira/flutter-packages/tree/master/dialog

ダイアログについてはこのライブラリを利用できます。ダイアログ以外の画面遷移では、これの内部の実装を参考に WidgetsBindingObserver を使って状態待ちすればいけると思います。