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