如何将MutableLiveData< String>
转换为MutableLiveData< Int>
.
val text = NonNullMutableLiveData<String>("")
我的类NonNullMutableLiveData:
class NonNullMutableLiveData<T>(private val defaultValue: T) :
MutableLiveData<T>() {
override fun getValue(): T {
return super.getValue() ?: defaultValue
}
}
我想添加另一个MutableLiveData<Int>
,其中我改变了MutableLiveData<String>
的价值
谢谢
你应该使用 Transformations.map
来获取 intLiveData。
val intLiveData = Transformations.map(textLiveData) {
try {
it.toInt()
} catch (e: NumberFormatException) {
0
}
}
然后intLiveData.value
可能仍然为空,即使textLivaData.value
已经是"2"。因为intLiveData
在intLiveData
被观察和激活之前不会改变。
这意味着您应该将观察器设置为 intLiveData
,并等待观察器启动。
intLiveData.observe(lifecycleOwner, Observer{ intValue ->
// get the int value.
})
正如谷歌所说,
您可以使用转换方法在观察者的生命周期中携带信息。除非观察者正在监视返回的 LiveData 对象,否则不会计算转换。由于转换是延迟计算的,因此与生命周期相关的行为是隐式传递的,而无需额外的显式调用或依赖项。
您可以使用实时数据转换(特别是映射(:
LiveData intLiveData = Transformations.map(text, text -> {
try {
return Integer.parse(text);
} catch(NumberFormatException ignored) {
return 0;
}
});
对于 Kotlin 来说,像这样:
val intLiveData = Transformations.map(text) {
try {
it.toInt()
} catch (e: NumberFormatException) {
0
}
}