我撰寫了從資料庫回傳值的函式,它之所以有效,是因為我將值分配給狀態和重組,但這不是與資料庫互動的正確方式。
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 為空。因此,更改僅在似乎在回傳后執行的協程中可見。如果您能提供有關協程的任何好的資源,我將不勝感激。
uj5u.com熱心網友回復:
正確的方法是使用掛起函式,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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529285.html
