绑定到Android中的暂停功能

时间:2019-05-27 17:22:21

标签: android kotlin android-databinding kotlin-coroutines

我想将按钮单击绑定到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 个答案:

答案 0 :(得分:1)

您无法将数据绑定到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函数。