带有构造注入的ViewModel

时间:2019-04-20 17:55:04

标签: android viewmodel dagger-2

我正在学习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()

您能给我个建议吗?

0 个答案:

没有答案