如何启动一个永远不应该从 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立即开始任务。
我有这个代表“编辑数据”屏幕的可组合项:
@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立即开始任务。