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

Nic*_*lle 8 android android-livedata android-viewmodel android-architecture-components

我在使用时遇到问题,ViewModel而且LiveData我是使用ViewModel和LiveData arch组件的新手,并且在使用fragments和旋转屏幕时出现问题,观察者会被触发...我试图移动

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

我的场景非常简单:

  1. 登录屏幕上有电子邮件和密码
  2. 用户点击"登录"按钮
  3. viewmodel调用login(email, password)并设置LiveData对象的值
  4. 只是为了现在简单的展示吐司

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

我是否必须在onDestroyView()中执行某些操作?

提前致谢!

Nic*_*lle 9

好的,最后找到问题以及如何解决.LiveData不是为单个事件设计的.出于这个原因,有几种方法可以解决或处理它,这两个链接对我有用:

JoseAlcérreca的帖子处理这个问题

JoseAlcérreca的EventObserver

JoseAlcérreca的SingleLiveEvent课程

基本上:

在ViewModel中:

var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()

和活动或片段:

viewModel.eventLiveData.observe(this, EventObserver {
     it?.let {
          shortToast(it.message)
     }
})
Run Code Online (Sandbox Code Playgroud)


Thr*_*ian 5

这就是LiveData和ViewModel的工作原理.您正在获得具有相同LiveData的相同ViewModel,而LiveData具有上一个对象,例如User,在您调用时具有先前的凭据ViewModelProviders.of(this).get(MainViewModel::class.java).您可以重置LiveData用户onPause()onStop()将其重置为初始状态.

我不知道你怎么称toast,如果你可以分享你的ViewModel和MainActivity我可以更具体.