LiveData: удалить наблюдателя изнутри лямбда-наблюдателя - PullRequest
0 голосов
/ 18 октября 2019

Внутри моего фрагмента я наблюдаю живые данные:

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

, теперь перед вызовом navigate () , я хотел бы удалить наблюдателя из viewModel.emailValid и я вижу, что доступен removeObserver метод, который требует наблюдателя в качестве параметра. Можно ли каким-то образом ссылаться на наблюдателя внутри лямбды-наблюдателя?

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Прежде всего, поскольку вы не вызываете observeForever(), а просто вызываете observe(), чтобы наблюдать жизненные данные объекта, у которого есть жизненный цикл, вам, вероятно, не нужно удалять наблюдателя - это будетигнорируется / удаляется системой автоматически, когда подписчик перестает быть активным.

Однако, если вам действительно необходимо удалить наблюдателя вручную по какой-либо причине, вам придется сохранить наблюдателя в свойстве. Таким образом, позже вы сможете передать наблюдателя в качестве параметра методу 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)
0 голосов
/ 18 октября 2019

Вы можете использовать для него анонимный объект:

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)
             }
         }
     }
)
...