使用 rememberCoroutineScope() 与 LaunchedEffect
Using rememberCoroutineScope() vs LaunchedEffect
上下文
在 Jetpack compose 中,我们可以选择使用 rememberCoroutineScope()
以及使用 LaunchedEffect
可组合项,以便使用协程/运行 挂起函数(显示 snackbars 等)。
到目前为止我采用的惯例是记住我的组合树顶部的单个协程范围,并通过函数参数将其向下传递到需要它的地方。这似乎是一种很好的做法,但另一方面,它给我的函数签名增加了额外的噪音。
问题
- 在可组合函数中使用
LaunchedEffect
而不是 rememberCoroutineScope()
有什么理由吗?
- 是否值得为每个 compose 树创建/记住一次协程范围,或者我应该只在每个实际启动协程的函数中调用
rememberCoroutineScope()
?
留下我的理解:
问题 1:
LaunchedEffect
当您希望当您的可组合项是第一个 launched/relaunched(或当关键参数已更改)时必须执行某些操作时,应使用 LaunchedEffect
。例如,当您想从 ViewModel 请求一些数据或 运行 某种动画时...
rememberCoroutineScope
另一方面,专门用于存储协程范围,允许代码启动一些 suspend
函数...
恕我直言,它们之间的唯一关系是您还可以使用 LaunchedEffect
启动协程...
问题 2: 正如您在文档中看到的,rememberCoroutineScope
将在组合的特定点保留协程作用域的引用。因此,如果从重组中移除给定的可组合项,则该协程将自动取消。例如,您有以下可组合调用 A -> B -> C
。如果你还记得 C
中的协程作用域,并且将其从组合中移除,则协程会自动取消。但是如果你记得从 A
开始,通过 B
和 C
传递作用域,在 C
中使用这个作用域,然后 C
被移除,协程将继续运行ning(因为在A
中被记住了)...
当你在使用协程时需要使用 rememberCoroutineScope()
在事件发生后取消并重新启动协程
使用协程时使用LaunchedEffect()需要取消和
每次参数更改时重新启动协程并且它没有存储在
可变状态。
LaunchedEffect:运行 暂停可组合范围内的函数
要从可组合项内部安全地调用挂起函数,请使用 LaunchedEffect 可组合项。当 LaunchedEffect 进入 Composition 时,它会启动一个协程,并将代码块作为参数传递。如果 LaunchedEffect 离开组合,协程将被取消。
rememberCoroutineScope:获取 composition-aware 范围以在可组合项外启动协程
由于 LaunchedEffect 是一个可组合函数,它只能在其他可组合函数中使用。为了在可组合项之外启动协程,但限定范围以便一旦离开组合就会自动取消,请使用 rememberCoroutineScope
更多来自 here
上下文
在 Jetpack compose 中,我们可以选择使用 rememberCoroutineScope()
以及使用 LaunchedEffect
可组合项,以便使用协程/运行 挂起函数(显示 snackbars 等)。
到目前为止我采用的惯例是记住我的组合树顶部的单个协程范围,并通过函数参数将其向下传递到需要它的地方。这似乎是一种很好的做法,但另一方面,它给我的函数签名增加了额外的噪音。
问题
- 在可组合函数中使用
LaunchedEffect
而不是rememberCoroutineScope()
有什么理由吗? - 是否值得为每个 compose 树创建/记住一次协程范围,或者我应该只在每个实际启动协程的函数中调用
rememberCoroutineScope()
?
留下我的理解:
问题 1:
LaunchedEffect
当您希望当您的可组合项是第一个 launched/relaunched(或当关键参数已更改)时必须执行某些操作时,应使用 LaunchedEffect
。例如,当您想从 ViewModel 请求一些数据或 运行 某种动画时...
rememberCoroutineScope
另一方面,专门用于存储协程范围,允许代码启动一些 suspend
函数...
恕我直言,它们之间的唯一关系是您还可以使用 LaunchedEffect
启动协程...
问题 2: 正如您在文档中看到的,rememberCoroutineScope
将在组合的特定点保留协程作用域的引用。因此,如果从重组中移除给定的可组合项,则该协程将自动取消。例如,您有以下可组合调用 A -> B -> C
。如果你还记得 C
中的协程作用域,并且将其从组合中移除,则协程会自动取消。但是如果你记得从 A
开始,通过 B
和 C
传递作用域,在 C
中使用这个作用域,然后 C
被移除,协程将继续运行ning(因为在A
中被记住了)...
当你在使用协程时需要使用 rememberCoroutineScope() 在事件发生后取消并重新启动协程
使用协程时使用LaunchedEffect()需要取消和 每次参数更改时重新启动协程并且它没有存储在 可变状态。
LaunchedEffect:运行 暂停可组合范围内的函数
要从可组合项内部安全地调用挂起函数,请使用 LaunchedEffect 可组合项。当 LaunchedEffect 进入 Composition 时,它会启动一个协程,并将代码块作为参数传递。如果 LaunchedEffect 离开组合,协程将被取消。
rememberCoroutineScope:获取 composition-aware 范围以在可组合项外启动协程
由于 LaunchedEffect 是一个可组合函数,它只能在其他可组合函数中使用。为了在可组合项之外启动协程,但限定范围以便一旦离开组合就会自动取消,请使用 rememberCoroutineScope
更多来自 here