Как я могу получить уведомление только один раз об изменении liveData в разных фрагментах? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть этот кусок кода, где я наблюдаю errorMessageData и accountViewModel является viewModel с областью действия, и я наблюдаю это в разных фрагментах, я хочу быть уведомлен только один раз например, если в FirstFragment я получаю уведомление об ошибкеMessageData, а затем перехожу к SecondFragment Я не хочу получать уведомления снова или это должно быть верно для противоположного случая Если SecondFragment находится в активном состоянии, я уведомляю об изменении errorMessage Я не хочу получать уведомления в FirstFragment, когда я туда перехожу.

accountViewModel.errorMessageData.observe(viewLifecycleOwner, Observer {
  message ->
  message?.let { Toast.makeText(context, it, Toast.LENGTH_LONG).show() }
})

1 Ответ

1 голос
/ 07 июля 2019

Оберните ваш объект LiveData в ConsumableValue, как это

class ConsumableValue<T>(private val data: T) {

    private var consumed = false

    fun consume(block: ConsumableValue<T>.(T) -> Unit) {
        if (!consumed) {
            consumed = true
            block(data)
        }
    }
}

, затем в viewmodel

val foo = MutableLiveData<Consumable<Foo>>()

и в ваш фрагмент

viewModel.foo.observe(this, Observer { consumable ->
        consumable.consume {
            TODO()
        }
    })
...