MutableLiveData <String>до MutableLiveData <Int> - PullRequest
2 голосов
/ 10 июля 2019

Как я могу преобразовать 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 ]

2 голосов
/ 12 июля 2019

Вы должны использовать 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. Поскольку преобразования рассчитываются лениво, поведение, связанное с жизненным циклом, неявно передается без дополнительных явных вызовов или зависимостей.

0 голосов
/ 10 июля 2019

Вы можете использовать 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
        }
    }
...