使用 rememberCoroutineScope() 与 LaunchedEffect

Using rememberCoroutineScope() vs LaunchedEffect

上下文

在 Jetpack compose 中,我们可以选择使用 rememberCoroutineScope() 以及使用 LaunchedEffect 可组合项,以便使用协程/运行 挂起函数(显示 snackbars 等)。

到目前为止我采用的惯例是记住我的组合树顶部的单个协程范围,并通过函数参数将其向下传递到需要它的地方。这似乎是一种很好的做法,但另一方面,它给我的函数签名增加了额外的噪音。

问题

  1. 在可组合函数中使用 LaunchedEffect 而不是 rememberCoroutineScope() 有什么理由吗?
  2. 是否值得为每个 compose 树创建/记住一次协程范围,或者我应该只在每个实际启动协程的函数中调用 rememberCoroutineScope()

留下我的理解:

问题 1: LaunchedEffect 当您希望当您的可组合项是第一个 launched/relaunched(或当关键参数已更改)时必须执行某些操作时,应使用 LaunchedEffect。例如,当您想从 ViewModel 请求一些数据或 运行 某种动画时...
rememberCoroutineScope 另一方面,专门用于存储协程范围,允许代码启动一些 suspend 函数... 恕我直言,它们之间的唯一关系是您还可以使用 LaunchedEffect 启动协程...

问题 2: 正如您在文档中看到的,rememberCoroutineScope 将在组合的特定点保留协程作用域的引用。因此,如果从重组中移除给定的可组合项,则该协程将自动取消。例如,您有以下可组合调用 A -> B -> C。如果你还记得 C 中的协程作用域,并且将其从组合中移除,则协程会自动取消。但是如果你记得从 A 开始,通过 BC 传递作用域,在 C 中使用这个作用域,然后 C 被移除,协程将继续运行ning(因为在A中被记住了)...

当你在使用协程时需要使用 rememberCoroutineScope() 在事件发生后取消并重新启动协程

使用协程时使用LaunchedEffect()需要取消和 每次参数更改时重新启动协程并且它没有存储在 可变状态。

LaunchedEffect:运行 暂停可组合范围内的函数

要从可组合项内部安全地调用挂起函数,请使用 LaunchedEffect 可组合项。当 LaunchedEffect 进入 Composition 时,它会启动一个协程,并将代码块作为参数传递。如果 LaunchedEffect 离开组合,协程将被取消。

rememberCoroutineScope:获取 composition-aware 范围以在可组合项外启动协程

由于 LaunchedEffect 是一个可组合函数,它只能在其他可组合函数中使用。为了在可组合​​项之外启动协程,但限定范围以便一旦离开组合就会自动取消,请使用 rememberCoroutineScope

更多来自 here