Android Arch Components ViewModel 和 LiveData 在屏幕旋转后触发
Android Arch Components ViewModel and LiveData trigger after screen rotation
我在使用 ViewModel
和 LiveData
架构组件时遇到问题。使用 fragments
并旋转屏幕时,观察者会被触发...
我试着移动viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
在所有片段生命周期方法中,但没有成功。
我的场景比较简单:
- 带有电子邮件和密码的登录屏幕
- 用户点击“登录”按钮
- 视图模型调用
login(email, password)
并设置 LiveData 对象的值
- 暂时只显示一个 Toast
此时一切正常。但是当我旋转屏幕时,Toast 会再次出现而无需任何用户交互。
我必须在 onDestroyView()
中做些什么吗?
提前致谢!
这就是 LiveData 和 ViewModel 的工作原理。当您调用 ViewModelProviders.of(this).get(MainViewModel::class.java)
时,您将获得具有相同 LiveData 的相同 ViewModel,并且 LiveData 具有先前的对象,例如用户,以及先前的凭据。您可以重置 LiveData 的用户 onPause()
或 onStop()
以将其重置为初始状态。
我不知道你怎么称呼 toast,如果你能分享你的 ViewModel 和 MainActivity 我可以更具体。
Ok 终于找到问题所在以及如何解决了。 LiveData 不是为单个事件设计的。出于这个原因,有几种方法可以修复或处理它,这两个链接对我很有用:
Jose Alcérreca's post dealing with this problem
Jose Alcérreca's EventObserver
Jose Alcérreca's SingleLiveEvent class
基本上:
在视图模型中:
var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()
并在 Activity 或片段中:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})
我在使用 ViewModel
和 LiveData
架构组件时遇到问题。使用 fragments
并旋转屏幕时,观察者会被触发...
我试着移动viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
在所有片段生命周期方法中,但没有成功。
我的场景比较简单:
- 带有电子邮件和密码的登录屏幕
- 用户点击“登录”按钮
- 视图模型调用
login(email, password)
并设置 LiveData 对象的值 - 暂时只显示一个 Toast
此时一切正常。但是当我旋转屏幕时,Toast 会再次出现而无需任何用户交互。
我必须在 onDestroyView()
中做些什么吗?
提前致谢!
这就是 LiveData 和 ViewModel 的工作原理。当您调用 ViewModelProviders.of(this).get(MainViewModel::class.java)
时,您将获得具有相同 LiveData 的相同 ViewModel,并且 LiveData 具有先前的对象,例如用户,以及先前的凭据。您可以重置 LiveData 的用户 onPause()
或 onStop()
以将其重置为初始状态。
我不知道你怎么称呼 toast,如果你能分享你的 ViewModel 和 MainActivity 我可以更具体。
Ok 终于找到问题所在以及如何解决了。 LiveData 不是为单个事件设计的。出于这个原因,有几种方法可以修复或处理它,这两个链接对我很有用:
Jose Alcérreca's post dealing with this problem
Jose Alcérreca's EventObserver
Jose Alcérreca's SingleLiveEvent class
基本上:
在视图模型中:
var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()
并在 Activity 或片段中:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})