如何只通知一次不同片段中的 liveData 更改?

How can I be notified only once of liveData change in different Fragments?

我有这段代码,我正在观察 errorMessageData 和 accountViewModel 是 viewModel 使用 Activity 范围,我在不同的片段中观察它 我只想收到一次通知 例如,如果在 FirstFragment 中我收到有关 errorMessageData 的通知,然后我导航到 SecondFragment 我不想再次收到通知,或者它应该适用于相反的情况 如果 SecondFragment 处于活动状态,我会在那里通知 errorMessage 更改 我不想在导航到 FirstFragment 时收到通知。

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

像这样ConsumableValue将您的 LiveData 对象包裹起来

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

    private var consumed = false

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

然后在视图模型中

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

在你的片段中

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