簡體   English   中英

如何啟動一個永遠不應該從 Compose 事件處理程序中取消的協程

[英]How to launch a coroutine that should never be canceled from a Compose event handler

我有這個代表“編輯數據”屏幕的可組合項:

@Composable
fun EditNodeScreen(
    vm: EditNodeViewModel,
    canceled: () -> Unit,
    accepted: (id: UUID) -> Unit
) {
    // ...
    Button(onClick = {
      val id = vm.save()
      accepted(id)
    }) {
      Text(text = "Save")
    }
}

除了, EditNodeViewModel.save()實際上是一個暫停 function,所以我不能那樣調用它。

我能找到的是我應該使用rememberCoroutineScope()創建協程 scope ,然后使用它來啟動協程:

onClick = {
    coroutineScope.launch {
        val id = vm.save()
        accepted(id) // side question: do I have to switch back to Main context?
    }
}

但是文檔還說,如果組合被分離,這個協程將被取消。 不想在開始后取消保存過程!

這仍然是正確的做法,還是有更好的方法? 我應該使用GlobalScope.launch嗎?

如果您必須處理即使用戶離開屏幕也應該完成的操作,請使用WorkManager

文檔中,

WorkManager 適用於需要可靠運行的工作,即使用戶離開屏幕、應用程序退出或設備重啟也是如此。

使用加急工作立即開始任務。

暫無
暫無

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

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