首页 文章

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

提问于
浏览
3

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

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

我的场景非常简单:

  • 使用电子邮件和密码登录屏幕

  • 用户点击"login"按钮

  • viewmodel调用 login(email, password) 并设置LiveData对象的值

  • 只是为了现在简单的展示吐司

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

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

提前致谢!

2 回答

  • 4

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

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

  • 4

    好的,最后找到问题以及如何解决 . 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)
         }
    })
    

相关问题