kotlin 如何从协程返回值/等待协程完成

2wnc66cl  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(344)

我写了函数从数据库返回值,它的工作,因为我赋值给状态和重组,但这不是正确的方式与数据库交互。

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是空的。所以修改只在协程中可见,协程似乎是在返回后执行的。如果你能提供任何关于协程的好资源,我将不胜感激。

qjp7pelc

qjp7pelc1#

正确的方法是使用suspend函数和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
    }

相关问题