繁体   English   中英

LiveData:从观察者 lambda 内部移除观察者

[英]LiveData: Remove observer from inside Observer lambda

在我的片段中,我观察到一个实时数据:

 viewModel.emailValid.observe(
     this,
     Observer<GenericResponse> {
         dismissProgressBar()
         if (it != null && it.success) {
             findNavController().navigate(R.id.action_navigatesomewhere)
         }
     }
)

现在在调用navigate()之前,我想从viewModel.emailValid中删除观察者,并且我看到了需要观察者作为参数的可用removeObserver方法。 是否可以以某种方式引用观察者 lambda 内部的观察者?

首先,由于您没有调用observeForever() ,而只是调用observe()来观察来自具有生命周期的object 的实时数据,因此您可能不需要删除观察者——它将被忽略/删除当订户停止活动时,系统会自动进行。

但是,如果您出于某种原因确实需要手动删除观察者,则必须将观察者保存到属性中。 这样,您以后就可以将观察者作为参数传递给方法removeObserver()

// Define your observer as a property
private val emailValidObserver = Observer<GenericResponse> { onEmailValidChanged(it) }

...

private fun onEmailValidChanged(emailValidResponse: GenericResponse) {
    dismissProgressBar()
    if (emailValidResponse != null && emailValidResponse.success) {
        findNavController().navigate(R.id.action_navigatesomewhere)
    }
}

...

// Observe the livedata with the observer you have defined
viewModel.emailValid.observe(this, emailValidObserver)

...

// Stop observing the livedata
shoppingListName.removeObserver(emailValidObserver)

另一方面,如果在某个时候你想删除与你的生命周期实例相关的所有观察者,你可以调用这个方法:

removeObservers(this)

您可以使用匿名 object :

viewModel.emailValid.observe(
     this,
     object : Observer<GenericResponse> {
         override fun onChanged(it: GenericResponse?) {
             viewModel.emailValid.removeObserver(this)
             dismissProgressBar()
             if (it != null && it.success) {
                 findNavController().navigate(R.id.action_navigatesomewhere)
             }
         }
     }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM