Android Arch Components ViewModel 和 LiveData 在屏幕旋转后触发

Android Arch Components ViewModel and LiveData trigger after screen rotation

我在使用 ViewModelLiveData 架构组件时遇到问题。使用 fragments 并旋转屏幕时,观察者会被触发...

我试着移动viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) 在所有片段生命周期方法中,但没有成功。

我的场景比较简单:

  1. 带有电子邮件和密码的登录屏幕
  2. 用户点击“登录”按钮
  3. 视图模型调用 login(email, password) 并设置 LiveData 对象的值
  4. 暂时只显示一个 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)
     }
})