报告在挂起上下文中可能存在问题的隐式 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 议题

可能的解决方案:

要解决此问题,您可以:

如果您确定代码是正确的,可以通过显式指定接收者来使您的意图明确。 在上面的示例中,这将是 this@runBlocking.launch { ... }。 但请注意,在这种情况下,代码的语义不会改变