绑定到 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
函数。
我想将按钮点击绑定到视图模型中的暂停函数。
这是我的代码:
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
函数。