En la documentación de ViewModel
Sin embargo, los objetos ViewModel nunca deben observar cambios en los observables conscientes del ciclo de vida, como los objetos LiveData.
Otra forma es que los datos implementen RxJava en lugar de LiveData, entonces no tendrá el beneficio de ser consciente del ciclo de vida.
En la muestra de Google de todo-mvvm-live-kotlin , usa una devolución de llamada sin LiveData en ViewModel.
Supongo que si desea cumplir con la idea completa de ser un ciclo de vida, debemos mover el código de observación en Actividad / Fragmento. De lo contrario, podemos usar callback o RxJava en ViewModel.
Otro compromiso es implementar MediatorLiveData (o Transformations) y observar (ponga su lógica aquí) en ViewModel. Tenga en cuenta que el observador MediatorLiveData no se activará (igual que Transformaciones) a menos que se observe en Actividad / Fragmento. Lo que hacemos es poner una observación en blanco en Activity / Fragment, donde el trabajo real se realiza en 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 {
})
PD: leí ViewModels y LiveData: Patterns + AntiPatterns que sugirieron que Transformations. No creo que funcione a menos que se observe LiveData (lo que probablemente requiera que se haga en Activity / Fragment).