I have a problem when using ViewModel
and LiveData
arch components. When using fragments
and rotating the screen, the observer gets triggered...
I tried to move viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
in all the fragment lifecycle methods, but with no success.
My scenario is relatively straightforward:
login(email, password)
and sets the value of the LiveData objectAt this point everything is okay. But when I rotate the screen the Toast appears again without any user interaction.
Do I have to do something in onDestroyView()
?
Thanks in advance!
Ok Finally found the problem and how to solve. LiveData is not designed for single events. For that reason there is a couple of ways to fix it or handle it, this two links were useful for me:
Jose Alcérreca's post dealing with this problem
Jose Alcérreca's EventObserver
Jose Alcérreca's SingleLiveEvent class
Basically:
In ViewModel:
var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()
and In Activity or Fragment:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})
It's how LiveData and ViewModel works. You are getting same ViewModel with same LiveData and LiveData has previous object, User for instance, with previous credentials when you call ViewModelProviders.of(this).get(MainViewModel::class.java)
. You can reset User of LiveData onPause()
or onStop()
to reset it to initial state.
I don't know how you call toast, if you can share your ViewModel and MainActivity i can be more specific.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With