Как программно вызвать уведомление об изменении MutableLiveData - PullRequest
0 голосов
/ 24 января 2020

У меня есть свойство LiveData для состояния формы входа, подобное этому

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

Класс данных AuthFormState имеет дочерние объекты данных для каждого поля

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

, а класс FieldState выглядит так

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

Когда пользователь вводит какое-либо значение в поле, соответствующий объект FieldState обновляется и присваивается родительскому объекту AuthFormState

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

Проблема заключается в том, что наблюдатель authFormState не уведомляется в этом случае.

Можно ли вызвать уведомление программно?

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Вы должны установить значение для себя, например: _authFormState.value = _authFormState.value, чтобы вызвать refre sh. Вы можете написать метод расширения, чтобы сделать этот очиститель:

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

Для такого простого класса данных я бы порекомендовал неизменность, чтобы избежать подобных проблем вообще (заменяет все эти var с val s ). Замените validateEmail() чем-то вроде этого:

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

При проверке полей вы можете создать новый объект данных и установить для него действительные данные.

fun validateFields() = _authFormState.value?.let {
        _authFormState.value = AuthFormState(
            validateEmail(it.email),
            validatePassword(it.password)
       )
    }
0 голосов
/ 24 января 2020

Может быть, вы можете сделать:

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