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



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

      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
    }

最新更新