首页 > 解决方案 > 绑定到android中的挂起函数

问题描述

我想将按钮单击绑定到视图模型中的暂停功能。

这是我的代码:

注册活动视图模型.kt

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

活动注册.xml

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

我收到一个说ActivityRegistrationBindingImpl未生成的数据绑定错误。经过大量搜索后,我意识到当我删除suspend关键字并注释里面的代码时,它工作正常,但它必须是一个暂停的函数。

有谁知道如何修理它?

标签: androidkotlinandroid-databindingkotlin-coroutines

解决方案


您不能将数据绑定到suspend函数,恕我直言,视图模型首先不应该公开suspend函数。我建议:

步骤#1:suspendregister()

步骤#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提供的选项。或者,管理您自己的协程范围。将确保您可以在 Android 主应用程序线程上使用该工作的任何结果。androidx.lifecycle:lifecycle-viewmodel-ktx2.1.0-alpha01Dispatchers.Main

现在,您的数据绑定表达式可以引用register(),而您仍然拥有调用下游suspend函数的协程范围。


推荐阅读