[英]How to create different viewModels for a common fragment?
在我的 Android 應用中,有 3 個 Fragment 布局和功能相似,只是 fetcher 參數不同。 簡而言之,它可以定義為
class MyFragment(private val fetcher: /* fetcher type */) : Fragment() {
// Somme implementations
}
class MyFragmentViewModel(private val fetcher: /* fetcher type */) : ViewModel() {
// ViewModel implementations
}
要創建這三個片段,我只需將三個不同的fetcher
傳遞給MyFragment
,而MyFragment
需要將fetcher
傳遞給它的 viewModel。
我的問題是,如何讓三個片段都有自己的viewModel? 我通過
val viewModel: MyFragmentViewModel by viewModels()
如果我什么都不做,這三個片段可能會共享同一個 viewModel,這不符合我的要求。 我認為這可以通過向viewModels()
方法提供factoryProducer
或ownerProducer
來完成,但我找不到很多關於它的參考資料,所以我不知道如何實現我的目標。
我終於解決了。
首先,我需要ViewModelProvider.Factory
:
class MyFragmentViewModelFactory(private val fetcher: /* fetcher type */) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MyFragmentViewModel(this.fetcher) as T
}
}
然后在我的片段中使用 viewModel:
val viewModel: MyFragmentViewModel by viewModels {
NyFragmentViewModelFactory(fetcher)
}
要在這種情況下使用 Navigation 框架,只需刪除MyFragment
fetcher
,並使用 SafeArgs 傳遞一個解析為不同fetcher
的枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.