作者:法国警方解放军_847 | 来源:互联网 | 2022-12-10 07:26
我在使用时遇到问题,ViewModel
而且LiveData
我是使用ViewModel和LiveData arch组件的新手,并且在使用fragments
和旋转屏幕时出现问题,观察者会被触发...我试图移动
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
在所有片段生命周期方法中但没有成功.
我的场景非常简单:
登录屏幕上有电子邮件和密码
用户点击"登录"按钮
viewmodel调用login(email, password)
并设置LiveData对象的值
只是为了现在简单的展示吐司
在这一点上一切都好.但是当我旋转屏幕时,Toast再次出现而没有任何用户交互.
我是否必须在onDestroyView()中执行某些操作?
提前致谢!
1> Nicolas Jafe..:
好的,最后找到问题以及如何解决.LiveData不是为单个事件设计的.出于这个原因,有几种方法可以解决或处理它,这两个链接对我有用:
JoseAlcérreca的帖子处理这个问题
JoseAlcérreca的EventObserver
JoseAlcérreca的SingleLiveEvent课程
基本上:
在ViewModel中:
var eventLiveData: MutableLiveData> = MutableLiveData()
和活动或片段:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})
2> Thracian..:
这就是LiveData和ViewModel的工作原理.您正在获得具有相同LiveData的相同ViewModel,而LiveData具有上一个对象,例如User,在您调用时具有先前的凭据ViewModelProviders.of(this).get(MainViewModel::class.java)
.您可以重置LiveData用户onPause()
或onStop()
将其重置为初始状态.
我不知道你怎么称toast,如果你可以分享你的ViewModel和MainActivity我可以更具体.