簡體   English   中英

協程 Scope 正確實現與狀態

[英]Coroutine Scope correct implementation with states

我正在使用 MVVM 架構和 Jetpack Compose 制作零售應用程序。

設想。

  1. 創建用於創建商店訪問的頁面,頂部欄上有一個保存按鈕。
  2. 單擊保存時,必須顯示包含兩個項目的下拉菜單,保存和保存並打開,第一個選項是保存訪問,第二個選項是保存並打開相同的訪問詳細信息頁面,但具有導航可見性。

問題:我正在使用 Coroutine scope 保存並導航到其他屏幕。 我顯示 3 毫秒延遲,如果響應沒有在 3 毫秒出現怎么辦。如果 api 失敗,如何顯示消息。 如何以具體方式做到這一點:請提出建議,因為我需要顯示從保存訪問到下一個保存詳細信息頁面的導航。

 DropdownMenu(
            expanded = viewModel.isDropdownMenuExpanded,
            onDismissRequest = { viewModel.isDropdownMenuExpanded = false }
        ) {
           
            for (title in SaveVisitActions.values())
                DropdownMenuItem(
                    onClick = {
                        when (title) {
                            SaveVisitActions.SAVE -> {
                                viewModel.handleSave()
                            }
                            SaveVisitActions.SAVEANDOPEN -> {
                                CoroutineScope(Dispatchers.IO).launch {
                                    delay(3000)
                                    withContext(Dispatchers.Main) {
                                        if (viewModel.isCreateSuccess.value) {
                                            navController.navigate(
                                                "${Screen.VisitDetailScreen.route}/${viewModel.objectState.value?.id}"
                                            )
                                        }

                                    }
                                }
                                viewModel.handleSave()

                            }
                        }
                    }) {
                    Text(text = title.title)
                }
        }

您可以使用 join() function,它是一個暫停 function,即它可以從協程或另一個暫停 function 中調用。 Job 阻塞所有線程,直到編寫它的協程或上下文完成它的工作。 只有當協程完成時,join() function 之后的行才會被執行。

使用 await() 方法等待您正在等待的值。 我想您正在等待視圖 model 中 isCreateSuccess 的值。 創建一個等待暫停返回的值的作業 function 等待來自視圖 model 的成功值。

val handleSave = async { waitForSuccess() }

if(handleSave.await()){
    viewModel.handleSave()
}else{
     // show your error here
}

suspend fun waitForSuccess() : Boolean{
    // get your Success Value from view model here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM