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が取得できます。