报告在挂起上下文中可能存在问题的隐式 CoroutineScope 接收器访问。
当一个挂起函数或 Lambda 从外部上下文捕获隐式 CoroutineScope 接收器时,可能会导致意外行为。
这样的代码可能容易违反结构化并发的规则,即使它看似结构良好。
这可能在处理错误、取消计算或管理生存期时导致不正确的行为。
一个典型示例:
fun processFlow(flow: Flow<String>) {
runBlocking {
flow.collectLatest {
// 在 this@runBlocking CoroutineScope 上启动
launch {
longProcessing(value)
}
}
}
}
suspend fun longProcessing(value: String) { ... }
在上面的示例中,launch { ... } 调用在外部 runBlocking 调用的隐式 CoroutineScope 中启动协程。
因此,collectLatest 无法在需要时取消这些协程。
此检查将检测在从当前挂起的 lambda(即 collectLatest 的主体)外部捕获的 CoroutineScope 上调用 launch 的情况。
有关此特定问题的更多信息,请参阅此 GitHub 议题。
可能的解决方案:
要解决此问题,您可以:
coroutineScope { ... } 构建器创建一个与挂起函数的生存期绑定的子作用域CoroutineScope 来自当前的语法上下文
如果您确定代码是正确的,可以通过显式指定接收者来使您的意图明确。 在上面的示例中,这将是 this@runBlocking.launch { ... }。
但请注意,在这种情况下,代码的语义不会改变。