在我的Android应用中,有三个片段,布局和功能都很相似,只是在一个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?我通过以下方式获得片段的viewModel。
val viewModel: MyFragmentViewModel by viewModels()
而如果我什么都不做,三个片段可能会共享同一个viewModel,这不符合我的要求。我认为可以通过提供 factoryProducer
或 ownerProducer
至 viewModels()
方法,但我找不到很多关于它的参考资料,所以我不知道如何实现我的目标。
我终于解决了。
首先,我需要将 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框架,只需要删除 fetcher
争论中 MyFragment
并使用SafeArgs传递一个枚举,该枚举解析为不同的 fetcher
s.