У документації ViewModel
Однак об'єкти ViewModel ніколи не повинні спостерігати змін у спостережуваних за життєвим циклом, таких як об'єкти LiveData.
Інший спосіб полягає в тому, щоб дані реалізовували RxJava, а не LiveData, тоді вони не матимуть переваги знання життєвого циклу.
У зразку google todo-mvvm-live-kotlin він використовує зворотний виклик без LiveData у ViewModel.
Я здогадуюсь, якщо ви хочете виконати всю ідею бути життєвим циклом, нам потрібно перемістити код спостереження в Activity / Fragment. В іншому випадку ми можемо використовувати зворотний виклик або RxJava у ViewModel.
Іншим компромісом є реалізація MediatorLiveData (або Трансформації) та спостереження (помістіть свою логіку тут) у ViewModel. Зверніть увагу, що спостерігач MediatorLiveData не спрацьовує (те саме, що і перетворення), якщо це не спостерігається в Activity / Fragment. Що ми робимо, ми ставимо пусте спостереження в Activity / Fragment, де справжня робота фактично виконується в ViewModel.
fun start(id : Long) : LiveData<User>? {
val liveData = MediatorLiveData<User>()
liveData.addSource(dataSource.getById(id), Observer {
if (it != null) {
}
})
}
viewModel.start(id)?.observe(this, Observer {
})
PS: Я читав ViewModels та LiveData: Patterns + AntiPatterns, які пропонували перетворення. Я не думаю, що це працює, якщо не спостерігається LiveData (що, ймовірно, вимагає, щоб це було зроблено в Activity / Fragment).