可变实时数据<String>到可变实时数据<Int>



如何将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"。因为intLiveDataintLiveData被观察和激活之前不会改变。

这意味着您应该将观察器设置为 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
        }
    }

最新更新