如何只通知一次不同片段中的 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()
}
})
我有这段代码,我正在观察 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()
}
})