ViewModel с конструкцией впрыска - PullRequest
0 голосов
/ 20 апреля 2019

Я изучаю компоненты Dagger и Architecture, и мне нужно создать виртуальную машину с конструктором, передавая значение int и репозиторий внутри WM.

Я пишу «рабочий» код, но мое решение поможетбыть проблемой в будущем:

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, только репо (или контекст, или что-то не «зависит от времени выполнения», как вы понимаете, это правильно).Так что теперь это работает так ужасно:

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()

Можете ли вы дать мне совет, что мне делать?

...