如何在Kotlin中将MutableLiveData <Boolean>的值设置为负数?

问题描述

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

解决方法

这会将实时数据转换为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 
})

以下是文档: https://developer.android.com/reference/androidx/lifecycle/Transformations#map(androidx.lifecycle.LiveData%3CX%3E,%20Y%3E)

,

如果使用诸如let之类的范围函数包装该设置值,则只有在该值不为null时才可以对其求反,否则该求反将被忽略。

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

您可以做这样的事情

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

postValue将触发displayCheckBox

的观察者 ,

我不喜欢在这种情况下使用.let,因为那样会保留LiveData的空值,这显然是您要避免的事情。我将使用以下内容:

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

这遵循以下布尔值吗?映射:

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

如果要将值设置为null而不是false,则可以使用以下内容:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...