【问题标题】:MutableLiveData<String> to MutableLiveData<Int>MutableLiveData<String> 到 MutableLiveData<Int>
【发布时间】:2019-07-10 11:32:43
【问题描述】:

如何将MutableLiveData&lt; String&gt; 转换为MutableLiveData&lt; Int&gt;

 val text = NonNullMutableLiveData<String>("")

我的类 NonNullMutableLiveData

 class NonNullMutableLiveData<T>(private val defaultValue: T) :
        MutableLiveData<T>() {
        override fun getValue(): T {
            return super.getValue() ?: defaultValue
        }
    }

我想添加另一个MutableLiveData&lt;Int&gt;,其中我已经转换了MutableLiveData&lt;String&gt;的值

谢谢

【问题讨论】:

  • MutableLiveData 我认为会起作用
  • 这个问题不清楚,convert是什么意思?您想获取text 中的值并将其转换为Integer?您想知道如何创建MutableLiveData&lt;Integer&gt;?您想知道如何从一个LiveData 映射到另一个?
  • @MidasLefko 我想把它映射到另一个MutableLiveData&lt;Int&gt;

标签: android kotlin android-livedata android-jetpack


【解决方案1】:

您应该使用 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.
})

正如google 所说,

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

【讨论】:

    【解决方案2】:

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

    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
            }
        }
    

    【讨论】:

    • 我尝试了 Kotlin 示例。 intLiveData 中的值始终为空。在val text = NonNullMutableLiveData&lt;String&gt;("") 内部值更改但在intLiveData 中没有更改,我正在使用 2 路数据绑定到 EditText。
    • 上面的映射乐趣起作用了。听起来您在其他地方有问题,也许您的数据绑定没有向您的文本 LiveData 发布价值?我认为您应该尝试调试并添加一些日志记录,如果您仍然卡住,请提出另一个问题
    • 这很奇怪.. val a = text.value , val b = textInt.value a 的值为 2 而b 为空。我为textInt复制了上面的Kotlin版本代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多