语境
在 Jetpack compose 中,我们可以选择使用 rememberCoroutineScope()
以及使用 LaunchedEffect
可组合以使用协程/运行挂起功能(显示 snackbar 等)。
到目前为止,我采用的约定是在我的 compose 树的顶部记住一个协程范围,并通过函数参数将它传递到需要它的地方。这似乎是一种很好的做法,但另一方面,它给我的函数签名增加了额外的噪音。
问题
LaunchedEffect
超过 rememberCoroutineScope()
在可组合函数内部? rememberCoroutineScope()
在实际启动协程的每个函数中? 最佳答案
在这里留下我的理解:
问题一:LaunchedEffect
当您希望在您的可组合组件首次启动/重新启动(或关键参数已更改)时必须执行某些操作时,应使用此选项。例如,当您想从 ViewModel 请求一些数据或运行某种动画时......rememberCoroutineScope
另一方面,特定于存储协程范围,允许代码启动一些 suspend
功能...
恕我直言,它们之间的唯一关系是您也可以使用 LaunchedEffect
启动协程...
问题二:正如您在文档中看到的,rememberCoroutineScope
将协程范围的引用保持在组合的特定点。因此,如果从重组中删除给定的可组合项,则该协程将自动取消。例如,您有以下可组合调用 A -> B -> C
.如果你还记得 C
中的协程范围并且从组合中删除,协程会自动取消。但如果你记得 A
,通过 B
传递范围和 C
, 在 C
中使用此范围,然后是 C
被删除,协程将继续运行(因为它被记住在 A
中)...
关于android - 使用 rememberCoroutineScope() 与 LaunchedEffect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66474049/