J'ai un problème lors de l'utilisation de ViewModel
et LiveData
Je suis nouveau en utilisant les composants ViewModel et LiveData Arch et j'ai le problème lors de l'utilisation de fragments
et de faire pivoter l'écran déclenché par l'observateur. J'ai essayé de déplacer le
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.Java)
dans toutes les méthodes de cycle de vie des fragments mais sans succès.
Mon scénario est assez simple:
login(email, password)
et définit la valeur de l'objet LiveDataÀ ce stade, tout va bien. Mais lorsque je fais pivoter l'écran, le Toast apparaît à nouveau sans aucune interaction de l'utilisateur.
Dois-je faire quelque chose dans onDestroyView ()?
Merci d'avance!
Ok enfin trouvé le problème et comment le résoudre. LiveData n'est pas conçu pour des événements uniques. Pour cette raison, il existe plusieurs façons de le réparer ou de le gérer, ces deux liens m'ont été utiles:
article de Jose Alcérreca traitant de ce problème
EventObserver de Jose Alcérreca
classe SingleLiveEvent de Jose Alcérreca
Fondamentalement:
Dans ViewModel:
var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()
et en activité ou fragment:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})
C'est ainsi que LiveData et ViewModel fonctionnent. Vous obtenez le même ViewModel avec le même LiveData et LiveData a un objet précédent, User par exemple, avec des informations d'identification précédentes lorsque vous appelez ViewModelProviders.of(this).get(MainViewModel::class.Java)
. Vous pouvez réinitialiser l'utilisateur de LiveData onPause()
ou onStop()
pour le réinitialiser à son état initial.
Je ne sais pas comment vous appelez toast, si vous pouvez partager votre ViewModel et MainActivity, je peux être plus précis.