【发布时间】:2019-08-06 16:44:31
【问题描述】:
问题简介:
当使用 android 与 android jetpack 添加的MediatorLiveData 时,我发现自己经常从每个来源调用相同的函数。例如,这可能是因为,每当更新源时,我必须检查它是否有影响,或者另一个源是否更重要。代码中的示例(Kotlin,但不重要):
val isHovered = MutableLiveData<Boolean>()
val isSelected = MutableLiveData<Boolean>()
val color = MediatorLiveData<Int>().apply {
addSource(isHovered) { updateColor() }
addSource(isSelected) { updateColor() }
}
fun updateColor() {
if (isHovered.value == true)
color.value = Color.GREEN
else if (isSelected.value == true)
color.value = Color.RED
else
color.value = Color.GRAY
}
悬停时该项目为绿色,选中时为红色,未悬停时为灰色,否则为灰色。当 isSelected 更改为 true 时,我仍然需要检查它是否悬停,然后再将颜色更改为红色。此外,当 isHovering 更改为 false 时,我需要在将颜色更改为灰色之前检查它是否被选中。所以最简单的是一个函数,它考虑了所有变量并相应地设置颜色。
我的问题:
当 MediatorLiveData 从非活动状态变为活动状态时,由于视图被移至前台,函数updateColor 可能会针对每个发生变化的源被多次调用。这是不必要的,因为每次调用都已经考虑了所有变量。由于此函数可能非常复杂,并且可能有很多来源,有没有办法避免多次调用它来为源 LiveDatas 的相同状态?
【问题讨论】:
-
为什么需要
apply函数? -
@IgorGanapolsky 这是一个 Kotlin 的东西,它允许我直接使用一个对象,同时也返回它。您也可以从构造函数中调用
addSource函数。
标签: android android-livedata android-jetpack event-driven