gpt4 book ai didi

android - 为什么调用两次时会忽略Livedata setValue?

转载 作者:行者123 更新时间:2023-12-02 13:18:42 35 4
gpt4 key购买 nike

我有以下带有MutableLiveData data的ViewModel和另一个从ones派生的LiveData data,其方式是仅当data.number等于1时才更新其值。

class DummyViewModel : ViewModel() {

private val data = MutableLiveData<Dummy>()
val ones = data.mapNotNull { it.takeIf { it.number == 1 } }

init {
data.value = Dummy(1, "Init")
doSomething()

}

fun doSomething() {
data.value = Dummy(2, "Do something")
}
}

data class Dummy(val number: Int, val text: String)

fun <T, Y> LiveData<T>.mapNotNull(mapper: (T) -> Y?): LiveData<Y> {
val mediator = MediatorLiveData<Y>()
mediator.addSource(this) { item ->
val mapped = mapper(item)
if (mapped != null) {
mediator.value = mapped
}
}
return mediator
}

我在片段中观察到 ones。但是,如果执行 doSomething,我的片段中将不会收到任何更新。如果我不执行 doSomething,则 Init中正确存在虚拟的 ones,并且我收到了更新。

这是怎么回事为什么 ones为空,如何解决此问题?

最佳答案

也许我缺少了一些东西,但是这种行为对我来说似乎是意料之中的...

让我们尝试依次重现这两种情况。

没有doSomething():

  • 创建Livedata
  • 添加Dummy(1, "Init")
  • 开始侦听片段:由于number为1,它通过了过滤器,片段接收到它

  • 使用doSomething():
  • 创建Livedata
  • 添加Dummy(1, "Init")
  • 添加Dummy(2, "Do something")(LiveData仅保留最后一个值,因此,如果没有人注意,则第一个值会丢失)
  • 开始侦听片段:由于number为2,因此值被过滤且片段未接收到任何内容

  • 有点题外话:针对这样的ViewModel案例编写测试总是很好的,因为您将能够隔离问题并快速找到真正的原因。

    编辑:还请注意,您的过滤器仅适用于观察,将值放入 LiveData时不会应用。

    关于android - 为什么调用两次时会忽略Livedata setValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61032555/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com