Недавно решив использовать LiveData, я столкнулся с проблемой при инициализации переменной. У меня есть 2 действия (я не использую навигацию, но дело не в этом):
- Один - это список с элементами, получаемыми API
- Другой - подробное действие для выбранный элемент в предыдущем списке
Проблема в том, что мне нужно иметь возможность обращаться к подробному действию в режиме создания, т.е. в моей ViewModel объект не должен быть получен через Retrofit, а создан через новый создание.
Вот как это делается сейчас:
Подробная активность:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.details)
val isNew = intent.extras?.getBoolean("new")
if (isNew) {
// Trigger lazy property
viewModel.value
} else {
viewModel.getDetails()
}
presenter.value.observe(this, Observer { value ->
value?.let {
displayDetails(it)
}
})
}
ViewModel
class DetailsPresenter(private val repository: WorkOrderRepository)
: ViewModel(), LifecycleObserver {
val value: MutableLiveData<Details> by lazy { MutableLiveData(Details("")) }
fun getDetails() {
RetrofitClient.getDetails()
.onSuccess {
this.value.value = it
}
}
}
Проблема с этим методом в том, что мой метод displayDetails () вызывается дважды. Один для отложенной инициализации, а другой - на случай, если я просматриваю существующий элемент.
Как я могу инициализировать LiveData позже в коде?