如何以编程方式触发 MutableLiveData 更改通知

How to programically trigger notify on MutableLiveData change

我有一个 LiveData 属性 用于像这样的登录表单状态

private val _authFormState = MutableLiveData<AuthFormState>(AuthFormState())
val authFormState: LiveData<AuthFormState>
    get() =_authFormState

AuthFormState 数据 class 每个字段都有子数据对象

data class AuthFormState (
    var email: FieldState = FieldState(),
    var password: FieldState = FieldState()
)

FieldState class 看起来像这样

data class FieldState(
    var error: Int? = null,
    var isValid: Boolean = false
)

当用户在字段中键入一些值时,相应的 FieldState 对象会更新并分配给父 AuthFormState 对象

fun validateEmail(text: String) {
    _authFormState.value!!.email = //validation result
}

问题是在这种情况下没有通知 authFormState 观察者。

是否可以通过编程方式触发通知?

也许你可以:

fun validateEmail(text: String) {
    val newO = _authFormState.value!!
    newO.email = //validation result
    _authFormState.setValue(newO)
}

您必须将值设置为其自身,如下所示:_authFormState.value = _authFormState.value 以触发刷新。您可以编写一个扩展方法来使它更干净:

fun <T> MutableLiveData<T>.notifyValueModified() {
    value = value
}

对于这样一个简单的数据 class,我建议使用不变性来完全避免此类问题(将所有 var 替换为 val)。将 validateEmail() 替换为如下内容:

fun validateEmail(email: String) = //some modified version of email

验证字段时,您可以构造一个新的数据对象并将其设置为实时数据。

fun validateFields() = _authFormState.value?.let {
        _authFormState.value = AuthFormState(
            validateEmail(it.email),
            validatePassword(it.password)
       )
    }