NavigationでFragmentの戻り値を扱う

Kenji Abe
3 min readFeb 19, 2020

Navigation 2.3.0-alpha02 からNavControllerに currentBackStackEntrypreviousBackStackEntry が追加され、これらを使ってFragmentの戻り値を処理することが可能になりました。

内部的には各BackStackで SavedStateHandleViewModel を使ってるようです。

呼び出し元Fragment

呼び出し元のFragmentでは、 currentBackStackEntrySavedStateHandle からLiveDataを取得して、それをobserveしておきます。

遷移後のFragmentで値が設定された場合にこの画面が再び表示されると、ここに通知されます。

値を返すFragment

値を返すには previousBackStackEntrySavedStateHandle にセットするだけです。

扱えるデータ

こちらは Bundle と同じになります。適当なクラスをセットするとクラッシュするので、 ParcelableSerializable にする必要があります。

補足

戻り値を受け取るときにLiveDataとして取得してますが、 SaveStateHandle と同じ扱いができるので、次のように単純に get でも取得できます。

この値は回転やActivityがOSから破棄された場合でも残ってるので注意してください。もし、一度しか受け取りたくない場合は SavedStateHandleremove で削除する必要があります。

DialogFragment の場合は少し特殊です。以下のドキュメントを参考にしてください。

おまけ

このまま使うには少し長くて見通しよくないので拡張関数を作っておくと便利だと思います。

戻り値を1回しか受け取りたくない場合は次のようにすると簡単に実現可能です。

参考

--

--

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO