如何以编程方式触发 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)
)
}
我有一个 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)
)
}