W dokumentacji ViewModel
Jednak obiekty ViewModel nigdy nie mogą obserwować zmian obserwowalnych uwzględniających cykl życia, takich jak obiekty LiveData.
Innym sposobem jest implementacja danych RxJava zamiast LiveData, wtedy nie będzie miała korzyści z uwzględnienia cyklu życia.
W Google próbce todo-mvvm-live-kotlin używa wywołania zwrotnego bez LiveData w ViewModel.
Domyślam się, że jeśli chcesz zachować zgodność z całą ideą bycia produktem cyklu życia, musimy przenieść kod obserwacji w Activity / Fragment. W przeciwnym razie możemy użyć funkcji callback lub RxJava w ViewModel.
Innym kompromisem jest zaimplementowanie MediatorLiveData (lub Transformations) i obserwowanie (wstaw swoją logikę) w ViewModel. Zauważ, że obserwator MediatorLiveData nie zostanie wyzwolony (tak samo jak Transformacje), chyba że zostanie zaobserwowany w Activity / Fragment. To, co robimy, to umieszczamy pustą obserwację w Activity / Fragment, gdzie prawdziwa praca jest faktycznie wykonywana w 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: Czytałem ViewModels i LiveData: Patterns + AntiPatterns, które sugerowały, że Transformations. Nie sądzę, żeby to działało, chyba że obserwuje się LiveData (co prawdopodobnie wymaga wykonania w Activity / Fragment).