我在使用 ViewModel
和 LiveData
时遇到问题我使用ViewModel和LiveData arch组件是新的,并且在使用 fragments
并且旋转屏幕时会出现问题,观察者会被触发...我试图移动
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
在所有片段生命周期方法中但没有成功 .
我的场景非常简单:
-
使用电子邮件和密码登录屏幕
-
用户点击"login"按钮
-
viewmodel调用
login(email, password)
并设置LiveData对象的值 -
只是为了现在简单的展示吐司
在这一点上一切都好 . 但是当我旋转屏幕时,Toast再次出现而没有任何用户交互 .
我是否必须在onDestroyView()中执行某些操作?
提前致谢!
2 回答
这就是LiveData和ViewModel的工作原理 . 您正在获得具有相同LiveData的相同ViewModel,而LiveData具有上一个对象,例如User,当您调用
ViewModelProviders.of(this).get(MainViewModel::class.java)
时具有先前的凭据 . 您可以重置LiveData的用户onPause()
或onStop()
将其重置为初始状态 .我不知道你怎么称toast,如果你可以分享你的ViewModel和MainActivity我可以更具体 .
好的,最后找到问题以及如何解决 . 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()
和活动或片段: