我正在学习Dagger和Architecture组件,我需要使用构造函数,传递int值以及WM内部存储库来创建VM。
我正在编写“有效的”代码,但是我的解决方案将来会成为问题:
class AnimalWithHintsViewModel constructor(private val animalID: Int) : ViewModel() {
@Inject
lateinit var animalRepository: AnimalRepository
private val data = MutableLiveData<AnimalWithHints>()
fun setData(animalData: AnimalWithHints) {
data.value = animalData
}
fun getData(): LiveData<AnimalWithHints> {
if (data.value == null) {
data.value = AnimalWithHints()
}
LibApp.get().injector.inject(this)
data.value = animalRepository.getAnimalWithHintsByAnimalId(animalID)
return data
}
fun getDataAdditional(): LiveData<AnimalWithHints> {
return data
}
}
在getData()
上注入不是错误,我只需要在某个地方注入存储库。注入构造函数将是很棒的。我读了一下,我知道我可以做到,创建了自己的工厂。但是在工厂中,我无法传递我的animalID,只能传递repo(或上下文,或者不“依赖于运行时”,因为您理解它是正确的)。所以现在它以这种丑陋的方式工作:
val animalWithHintsViewModel =
ViewModelProviders.of(activity!!, object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return AnimalWithHintsViewModel(animalId) as T
}
})[AnimalWithHintsViewModel::class.java].getData()
您能给我个建议吗?