在使用ViewModel
和LiveData
时遇到问题,我是ViewModel和LiveData拱形组件的新手,在使用fragments
并旋转触发观察者的屏幕时遇到了问题。 。
我试图移动
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
所有片段生命周期方法中都没有成功。
我的情况很简单:
login(email, password)
并设置LiveData对象的值这时一切都很好。但是当我旋转屏幕时,Toast再次出现,没有任何用户交互。
我必须在onDestroyView()中做些什么吗?
谢谢!
答案 0 :(得分:8)
好,终于找到了问题以及如何解决。 LiveData不适用于单个事件。因此,有两种方法可以修复或处理它,这两个链接对我很有用:
Jose Alcérreca's post dealing with this problem
Jose Alcérreca's EventObserver
Jose Alcérreca's SingleLiveEvent class
基本上:
在ViewModel中:
var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()
以及活动中或片段中:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})
答案 1 :(得分:5)
LiveData和ViewModel的工作方式。您将获得具有相同LiveData的相同ViewModel,并且在调用ViewModelProviders.of(this).get(MainViewModel::class.java)
时,LiveData具有先前的对象(例如,用户)和先前的凭据。您可以将LiveData的用户onPause()
或onStop()
重置为初始状态。
我不知道您怎么称呼吐司,如果您可以共享ViewModel和MainActivity,我可以说得更具体些。