Android Compose ナビゲーションでは、ナビゲーション引数が に設定され、SavedStateHandle
でアクセスできるようになりますViewModel
。私は実際にこれを実行しており、実装についてはここで詳しく説明しています。https://stackoverflow.com/a/69145748/12385518。
問題は、なぜ/どのようにこれが起こっているのかについてのドキュメントが見つからないことです。実際、ナビゲーション引数が含まれているSavedStateHandle
ことさえ言及している公式ドキュメントさえ見つかりません。これについてもっと読みたいと思っています。これらのドキュメント (およびその他) を読みましたが、このトピックについては何も見つかりませんでした。
https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate https://developer.android.com/reference/androidx/lifecycle/SavedStateHandled
これはナビゲーション引数を渡すための非常に優れた手法のようですが、どこにも言及されていないため、別の手法に移行することを検討しています。
ベストアンサー1
ナビゲーション引数が に渡される方法を次に示しますViewModel
。
電話をする
NavController.navigate(route, args)
とNavBackStackEntry
創造された (ソース)。NavBackStackEntry
作成するSavedStateViewModelFactory
これは、その名前が示すように、ViewModel
(SavedStateHandle
ソース)。NavBackStackEntry
HasDefaultViewModelProviderFactory
前のステップで作成したファクトリーをプロパティdefaultViewModelProviderFactory
(ソース)。重要なことに、 に
HasDefaultViewModelProviderFactory
は別のプロパティもあります:defaultViewModelCreationExtras
。これには、 を構築するときに使用される追加のデータフィールドが含まれますViewModel
。ナビゲーション引数はここに保存されます (ソース)。viewModel
などの作成メソッドが呼び出されると、(この場合は)hiltViewModel
が を実装しているかどうかが確認されます。 実装している場合は、それらの追加情報(ナビゲーション引数)をビューモデルファクトリ(ViewModelStoreOwner
NavBackStackEntry
HasDefaultViewModelProviderFactory
ソース)。ビューモデルファクトリ(この場合は )
SavedStateViewModelFactory
は を作成しSavedStateHandle
、ナビゲーション引数(追加引数)を設定して、新しく作成された に提供しViewModel
、 がそれらにアクセスできるようにします(ソース)。