MutableLiveData <String>到MutableLiveData <Int>

时间:2019-07-10 11:32:43

标签: android kotlin android-livedata android-jetpack

如何将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>的值

谢谢

2 个答案:

答案 0 :(得分:2)

您应该使用Transformations.map来获取intLiveData。

val intLiveData = Transformations.map(textLiveData) {
    try {
        it.toInt()
    } catch (e: NumberFormatException) {
        0
    }
}

然后,即使intLiveData.value已经为“ 2”,textLivaData.value仍可能为空。因为intLiveData在观察并激活intLiveData之前不会改变。

这意味着您应该将观察者设置为intLiveData,然后等待观察者开始。

intLiveData.observe(lifecycleOwner,  Observer{ intValue ->
    // get the int value.
})

正如google所说,

  

您可以使用转换方法在观察者的整个生命周期中传递信息。除非观察者正在观察返回的LiveData对象,否则不会计算转换。由于这些转换是延迟计算的,因此无需额外的显式调用或依赖关系即可隐式传递与生命周期相关的行为。

答案 1 :(得分:0)

您可以使用LiveData Transformations(特别是map):

<meta contentType="text/html; charset=UTF-8"/>

对于Kotlin,像这样:

LiveData intLiveData = Transformations.map(text, text -> {
      try {
          return Integer.parse(text);
      } catch(NumberFormatException ignored) {
          return 0;
      }
});
相关问题