代码之家  ›  专栏  ›  技术社区  ›  Nicolas Jafelle

Android Arch组件视图模型和屏幕旋转后的LiveData触发器

  •  7
  • Nicolas Jafelle  · 技术社区  · 6 年前

    使用时出现问题 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()中做些什么吗?

    事先谢谢!

    2 回复  |  直到 6 年前
        1
  •  8
  •   Nicolas Jafelle    6 年前

    好的,最后找到了问题和解决方法。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)
         }
    })
    
        2
  •  5
  •   Thracian    6 年前

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

    我不知道你怎么叫Toast,如果你能分享你的viewModel和mainActivity,我可以更具体一些。