Dans la documentation de ViewModel
Cependant, les objets ViewModel ne doivent jamais observer les modifications des observables sensibles au cycle de vie, tels que les objets LiveData.
Une autre façon est que les données implémentent RxJava plutôt que LiveData, alors elles n'auront pas l'avantage d'être conscient du cycle de vie.
Dans google sample de todo-mvvm-live-kotlin , il utilise un rappel sans LiveData dans ViewModel.
Je suppose que si vous voulez vous conformer à l'idée générale d'être un élément du cycle de vie, nous devons déplacer le code d'observation dans Activity / Fragment. Sinon, nous pouvons utiliser le rappel ou RxJava dans ViewModel.
Un autre compromis consiste à implémenter MediatorLiveData (ou Transformations) et à observer (mettez votre logique ici) dans ViewModel. Remarquez que l'observateur MediatorLiveData ne se déclenchera pas (comme les transformations) sauf s'il est observé dans Activity / Fragment. Ce que nous faisons est de mettre une observation vide dans Activity / Fragment, où le vrai travail est réellement effectué dans 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: j'ai lu ViewModels et LiveData: Patterns + AntiPatterns qui suggéraient que Transformations. Je ne pense pas que cela fonctionne à moins que les LiveData ne soient observés (ce qui nécessite probablement que cela soit fait à Activity / Fragment).