Я изучаю компоненты 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()
Можете ли вы дать мне совет, что мне делать?