Android BindingAdapter не вызывается при обновлении значения - PullRequest
0 голосов
/ 04 ноября 2019

Один Activity, два Fragment с общим ViewModel. Я проверил, что ссылка на модель представления одинакова в каждом фрагменте.

В XML макета для первого фрагмента есть TextInputLayout. Фрагмент два обновляет модель представления логическим значением. Макет ввода текста отслеживает это значение и должен вызывать BindingAdapter при изменении значения.

Адаптер привязки срабатывает, когда создаются экземпляры фрагментов и их разметки раздуваются, поэтому я знаю, что представление наблюдаетэто значение. Однако позже, когда второй фрагмент обновляет значение, представление в первом фрагменте не запускает адаптер привязки.

Это в onCreateView() первого фрагмента:

registrationViewModel = activity?.run {
            ViewModelProviders
                .of(this, RegistrationViewModelFactory(prefs, dataFetcherService))
                .get(RegistrationViewModel::class.java)
        } ?: throw Exception("Invalid Activity")

иэто представление, которое наблюдает за этой моделью представления:

    <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/reg_auth_code_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
bind:errorState="@{registrationViewModel.registrationData.authorizationError}"
                bind:errorMessage="@{@string/invalid_auth_code}">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/reg_auth_code"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@{registrationViewModel.registrationData.authCode}"
                    android:hint="@string/enter_auth_code"
                    android:maxLines="1"
                    android:inputType="text"
                    android:imeOptions="actionDone"
                    app:autoSizeTextType="uniform"/>

            </com.google.android.material.textfield.TextInputLayout>

Что касается фрагмента два, тот же код в onCreateView ():

registrationViewModel = activity?.run {
            ViewModelProviders
                .of(this, RegistrationViewModelFactory(prefs, dataFetcherService))
                .get(RegistrationViewModel::class.java)
        } ?: throw Exception("Invalid Activity")

Когда кнопка нажата, фрагмент двух срабатыванийдействие в модели представления:

private fun attemptNavigationToUserData() {
    viewModelScope.launch {
        isAuthorized = runBlocking { useCase.isAuthorized() }
        registrationData.value?.authorizationError = !isAuthorized
    }
}

И, наконец, вот BindingAdapter:

@BindingAdapter("errorState", "errorMessage")
fun setErrorState(
    textInputLayout: TextInputLayout?,
    errorState: Boolean,
    errorMessage: String) {

    textInputLayout?.let {
        it.isErrorEnabled = errorState
        if (errorState) it.error = errorMessage
    }
}

Кажется, все это настроено правильно, AFAIK. Как я уже упоминал, адаптер привязки срабатывает, когда представления изначально надуваются, но больше никогда.

Почему мой XML не наблюдает модель представления? Или почему адаптер обновления не запускается при обновлении ??

Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...