绑定到 android 中的暂停函数

binding to a suspended function in android

我想将按钮点击绑定到视图模型中的暂停函数。

这是我的代码:

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 关键字并注释里面的代码时,它工作正常,但它必须是一个挂起的函数。

有人知道怎么解决吗?

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

第 1 步:从 register()

中删除 suspend 关键字

步骤 #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)
        }
    }
}

在这里,我使用 androidx.lifecycle:lifecycle-viewmodel-ktx 版本 2.1.0-alpha01 及更高版本提供的 viewModelScope 选项。或者,管理您自己的协程范围。 Dispatchers.Main 将确保您可以在 Android 主应用程序线程上获得该工作的任何结果。

现在,您的数据绑定表达式可以引用 register(),同时您仍然有一个协​​程作用域来调用下游 suspend 函数。