屏幕旋转后,Android Arch组件ViewModel和LiveData触发

时间:2018-07-20 20:51:25

标签: android android-architecture-components android-livedata android-viewmodel

在使用ViewModelLiveData时遇到问题,我是ViewModel和LiveData拱形组件的新手,在使用fragments并旋转触发观察者的屏幕时遇到了问题。 。 我试图移动

viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) 所有片段生命周期方法中都没有成功。

我的情况很简单:

  1. 使用电子邮件和密码登录屏幕
  2. 用户单击“登录”按钮
  3. 视图模型调用login(email, password)并设置LiveData对象的值
  4. 现在就简单地展示吐司

这时一切都很好。但是当我旋转屏幕时,Toast再次出现,没有任何用户交互。

我必须在onDestroyView()中做些什么吗?

谢谢!

2 个答案:

答案 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,我可以说得更具体些。