【发布时间】:2020-04-04 18:08:18
【问题描述】:
我有以下 ViewModel 与 MutableLiveData data 和另一个 LiveData ones 派生自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 为空,我该如何解决这个问题?
【问题讨论】:
-
你对这个
it.takeIf { it.number == 1 }有什么期待? -
@StanislavBondar 我希望
onesLiveData 仅在对象的number属性为1时更新其值。这当然只是为了演示目的。 -
@StanislavBondar 令我吃惊的问题是,如果调用
doSomething,则不会设置第一个data.value = Dummy(1, "Init")。
标签: android kotlin android-livedata android-jetpack android-viewmodel