привязка к приостановленной функции в андроиде - PullRequest
0 голосов
/ 27 мая 2019

Я хочу привязать нажатие кнопки к приостановленной функции внутри viewmodel.

это мой код:

RegistrationActivityViewModel.kt

    suspend fun register() {
        if (validateFields()) {
            val result = SourceplusplusApiService.invoke().registerUser(username.value!!, email.value!!, password.value!!).await()
            isRegistrationCompleted.value = getResultValue(result)
        }
    }

activity_registration.xml

<Button
          android:text="Register"
          android:onClick="@{()->viewmodel.register()}"
          android:textSize="16sp" />

Я получаю ошибку привязки данных, которая говорит, что ActivityRegistrationBindingImpl не сгенерировано. после многих поисков я понял, что когда я удаляю ключевое слово suspend и комментирую код внутри, он работает нормально, но это должна быть приостановленная функция.

Кто-нибудь знает, как это исправить?

1 Ответ

1 голос
/ 27 мая 2019

Вы не можете привязать данные к функции suspend, и ИМХО модель представления не должна в первую очередь представлять функцию suspend. Я рекомендую:

Шаг # 1: Удалить ключевое слово suspend из register()

Шаг # 2: Перепишите register(), чтобы запустить ваш код в подходящей области сопрограмм, чтобы любые функции suspend, которые он вызывает, обрабатывались правильно:

fun register() {
    viewModelScope.launch(Dispatchers.Main) {
        if (validateFields()) {
            val result = SourceplusplusApiService.invoke().registerUser(username.value!!, email.value!!, password.value!!).await()
            isRegistrationCompleted.value = getResultValue(result)
        }
    }
}

Здесь я использую опцию viewModelScope, предоставленную androidx.lifecycle:lifecycle-viewmodel-ktx версия 2.1.0-alpha01 и новее. Кроме того, управляйте своим собственным объемом сопрограмм. Dispatchers.Main обеспечит доступ к любым результатам этой работы в главном потоке приложений Android.

Теперь ваше выражение привязки данных может ссылаться на register(), в то время как у вас все еще есть сопрограмма для вызова нижестоящих suspend функций.

...