Как я могу установить значение MutableLiveData() как неблагоприятное в Kotlin?

#android #kotlin #android-livedata

#Android #kotlin #android-livedata

Вопрос:

_displayCheckBox является MutableLiveData<Boolean> , я надеюсь установить его как неблагоприятное.

Но кажется, что _displayCheckBox.value = !_displayCheckBox.value!! не может работать должным образом, как я могу это исправить?

Код A

 private val _displayCheckBox = MutableLiveData<Boolean>(true)
val displayCheckBox : LiveData<Boolean> = _displayCheckBox

fun switchCheckBox(){
    _displayCheckBox.value =  !_displayCheckBox.value!!   //It seems that it can't work well.
}
  

Комментарии:

1. что вы подразумеваете под «это не может хорошо работать»?

Ответ №1:

Если вы обернете установленное значение с помощью функции области видимости, такой как let , вы сможете отрицать значение, только если оно не равно null, в противном случае отрицание будет проигнорировано.

 fun switchCheckBox() {
    _displayCheckBox.value?.let {
        _displayCheckBox.value = !it
    }
}
  

Ответ №2:

Это преобразует текущие данные, инвертируя значение LiveData, оно будет наблюдать _displayCheckBox и изменять его, применяя {!it} операцию к своему значению:

 private val _displayCheckBox = MutableLiveData<Boolean>(true)
val displayCheckBox = Transformations.map(_displayCheckBox) { !it }
  

Обратите внимание, что вы должны соблюдать значение, чтобы запускать обновления:

SomeActivity.kt

 displayCheckBox.observe(this, Observer {value -> 
    // Do something with the value 
})
  

Вот документы:
<a rel="noreferrer noopener nofollow" href="https://developer.android.com/reference/androidx/lifecycle/Transformations#map(androidx.lifecycle.LiveData, androidx.arch.core.util.Function)» rel=»nofollow noreferrer»>https://developer.android.com/reference/androidx/lifecycle/Transformations#map(androidx.lifecycle.LiveData, androidx.arch.core.util.Функция)

Комментарии:

1. Спасибо! но я надеюсь инвертировать _displayCheckBox в функции switchCheckBox()

2. О! Я понял это сейчас, мой плохой, я постараюсь что-нибудь придумать

3. как насчет _displayCheckBox.value = _displayCheckBox.value?.not() ?

4. Спасибо! но ваш код точно такой же, как мой код !_displayCheckBox.value!! , я думаю, он не будет хорошо работать.

5. Оно останется нулевым, если значение равно null, и инвертирует его, если значение не равно null

Ответ №3:

вы можете сделать что-то вроде этого

 fun switchCheckBox() = _displayCheckBox.value?.let { _displayCheckBox.postValue(!it) }
  

postValue вызовет наблюдателя для displayCheckBox

Ответ №4:

Я не сторонник использования .let в этом сценарии, потому что это сохранит нулевое значение LiveData, которого, очевидно, вы собираетесь избегать. Я бы использовал следующее:

 fun toggleDisplayCheckBox() {
    _displayCheckBox.run { value = value == false }
}
  

Это соответствует следующему логическому значению? сопоставление:

 When the value is...
    true -> false
    false -> true
    null -> false
  

В случае, когда вы хотите, чтобы значение было установлено в true вместо false, когда оно равно null, вместо этого можно использовать следующее:

 fun toggleDisplayCheckBox() {
    _displayCheckBox.run { value = value != true }
}