Navigation 2.3.0-alpha02 からNavControllerに currentBackStackEntry
と previousBackStackEntry
が追加され、これらを使ってFragmentの戻り値を処理することが可能になりました。
内部的には各BackStackで SavedStateHandle
と ViewModel
を使ってるようです。
呼び出し元Fragment
呼び出し元のFragmentでは、 currentBackStackEntry
の SavedStateHandle
からLiveDataを取得して、それをobserveしておきます。
遷移後のFragmentで値が設定された場合にこの画面が再び表示されると、ここに通知されます。
値を返すFragment
値を返すには previousBackStackEntry
の SavedStateHandle
にセットするだけです。
扱えるデータ
こちらは Bundle
と同じになります。適当なクラスをセットするとクラッシュするので、 Parcelable
や Serializable
にする必要があります。
補足
戻り値を受け取るときにLiveDataとして取得してますが、 SaveStateHandle
と同じ扱いができるので、次のように単純に get
でも取得できます。
この値は回転やActivityがOSから破棄された場合でも残ってるので注意してください。もし、一度しか受け取りたくない場合は SavedStateHandle
の remove
で削除する必要があります。
DialogFragment
の場合は少し特殊です。以下のドキュメントを参考にしてください。
おまけ
このまま使うには少し長くて見通しよくないので拡張関数を作っておくと便利だと思います。
戻り値を1回しか受け取りたくない場合は次のようにすると簡単に実現可能です。