android - 绑定到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
关键字并注释里面的代码时,它工作正常,但它必须是一个暂停的函数。
有谁知道如何修理它?
解决方案
您不能将数据绑定到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
提供的选项。或者,管理您自己的协程范围。将确保您可以在 Android 主应用程序线程上使用该工作的任何结果。androidx.lifecycle:lifecycle-viewmodel-ktx
2.1.0-alpha01
Dispatchers.Main
现在,您的数据绑定表达式可以引用register()
,而您仍然拥有调用下游suspend
函数的协程范围。
推荐阅读
- python - 为什么它说队列是空的而不是空的?
- python - '
' django 错误 - javascript - 将数组值设置为对象的不同键
- python - 通过 CLI 创建 EB 应用程序时遇到问题
- apache-zookeeper - CHECK ZOOKEEPER 安装、启动和测试步骤失败
- json - 在 joblib.Parallel 中的 python 3.7 中解析 json
- android - 我的反应应用程序中的按钮在 iPhone 的浏览器中不可见
- javascript - 我如何从中获得价值在javascript中?
- python - 监控可用性 迪卡侬的产品
- javascript - 使用 JS、socketio、nodejs 的客户端之间的延迟移动/同步