如何启动一个永远不应该从 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()实际上是一个挂起函数,所以我不能这样调用它。

我能找到的是我应该用 rememberCoroutineScope() 创建协程作用域,然后用它来启动协程:

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

但是文档说如果组合被分离,这个协程将被取消。我不想一旦开始就取消保存过程!

这仍然是正确的做法吗,还是有更好的方法?我应该使用 GlobalScope.launch 吗?

如果您必须处理即使用户离开屏幕也应该完成的操作,请使用 WorkManager

来自Docs,

WorkManager is intended for work that is required to run reliably even if the user navigates off a screen, the app exits, or the device restarts.

使用Expedited work立即开始​​任务。