我写的函数从数据库返回值,它的工作,因为我分配值的状态和重组,但这不是正确的方式与数据库交互
fun getUser():State<User?>{
val id = sharedPrefs?.getString("uId", "")
id?.let {
if (it != "")
runBlocking {
CoroutineScope(Dispatchers.IO).launch {
repository?.getUser(it)?.let {
currentUser.value = it
Log.v("user_1",""+it)
}
}
}
}
Log.v("user_2",""+currentUser.value)
return currentUser
}
我认为runBlocking将使其工作,但user_1包含值和user_2是空的。所以更改只在协程中可见,协程似乎是在返回后执行的。如果您能提供任何关于协程的好的资源,我将不胜感激。
正确的方法是使用挂起函数和withContext
而不是launch
——还有其他一些东西我要在你的代码中清理(消除几乎所有的?.let
),但这应该做:
suspend fun getUser():State<User?>{
val id = sharedPrefs?.getString("uId", "")
id?.let {
if (it != "")
withContext(Dispatchers.IO) {
repository?.getUser(it)?.let {
currentUser.value = it
Log.v("user_1",""+it)
}
}
}
Log.v("user_2",""+currentUser.value)
return currentUser
}