Navigation GraphスコープのViewModel

Kenji Abe
3 min readApr 4, 2019

--

Photo by Jacob Townsend on Unsplash

2.1.0-alpha02 からNavigation Graphごとのスコープを使ったViewModelが取得できるようになっています。

これまではFragment間でViewModelを共有するにはActivityのスコープを使う必要がありました。そのためActivityが生存する限りViewModelも残り続ける問題がありました。これを使うことで、Navigation Graphに閉じることができ、そこから抜けるとViewModelが破棄されることになります。

簡単な例として、2番目と3番目のFragmentでのみ共有するViewModelを作ってみます。具体的には2番目から1番目のFragmentに戻ったらViewModelを破棄してくれます。

環境

Navigation Graph

まずは、以下のような単純な遷移でつくります。

次に、2番目と3番目を選択して、右クリックからNested Graphを作ります。今回はidを nested_nav_graph にしてます。

これでNavigation Graphは完成です。

ここで新しく作ったNested Graphのスコープで生存するViewModelを作ります。

ViewModel取得

あとはこのスコープでViewModelを取得するだけです。

navGraphViewModels を使ってViewModelを取得します。引数にはNested Graphのidを指定します。

このViewModelは2番目と3番目で同じインスタンスが使われ、2番目から1番目に戻ったタイミングで破棄されることになります。

一度戻ってから、再び2番目のほうに遷移すると、先ほどとは異なるViewModelのインスタンスが取得できます。

注意

これはNested Graphにのみ対応してる感じなります。そのため、メインのNavigation Graphのidを指定してViewModelを取得しようとするとクラッシュします。
これは、メインのNavigation GraphスコープはActivityのスコープと同じだから、使うことはないと思います。

実はこれは破棄するタイミングは2番目から戻った時というだけなので、Nested Graphより先のFragmentでも同じViewModelが取得できます。

--

--

Kenji Abe
Kenji Abe

Written by Kenji Abe

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

No responses yet