web-dev-qa-db-fra.com

Android Arch Components ViewModel et LiveData déclencheur après rotation de l'écran

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:

  1. Écran de connexion avec email et mot de passe
  2. L'utilisateur clique sur le bouton "connexion"
  3. le viewmodel appelle la login(email, password) et définit la valeur de l'objet LiveData
  4. Juste pour l'instant simple montrer un toast

À 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!

12
Nicolas Jafelle

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)
     }
})
9
Nicolas Jafelle

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.

5
Thracian