Nella documentazione di ViewModel
Tuttavia, gli oggetti ViewModel non devono mai osservare le modifiche agli osservabili sensibili al ciclo di vita, come gli oggetti LiveData.
Un altro modo è che i dati implementino RxJava piuttosto che LiveData, quindi non avranno il vantaggio di essere consapevoli del ciclo di vita.
Nell'esempio Google di todo-mvvm-live-kotlin , utilizza una richiamata senza LiveData in ViewModel.
Immagino che se vuoi rispettare l'intera idea di essere un prodotto del ciclo di vita, dobbiamo spostare il codice di osservazione in Activity / Fragment. Altrimenti, possiamo usare callback o RxJava in ViewModel.
Un altro compromesso è implementare MediatorLiveData (o Transformations) e osservare (inserire qui la logica) in ViewModel. Si noti che l'osservatore MediatorLiveData non si attiverà (come le trasformazioni) a meno che non venga osservato in Activity / Fragment. Quello che facciamo è inserire un'osservazione vuota in Activity / Fragment, dove il lavoro reale viene effettivamente svolto in 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: ho letto ViewModels e LiveData: Patterns + AntiPatterns che suggerivano Transformations. Non penso che funzioni a meno che non venga osservato LiveData (che probabilmente richiede che venga eseguito in Activity / Fragment).