我想将按钮单击绑定到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
关键字并注释其中的代码时,它可以正常工作,但必须是一个暂停的函数。
有人知道如何解决吗?
答案 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
函数。