使用rememberCoroutineScope()与LaunchedEffect
语境
在 Jetpack compose 中,我们可以选择使用rememberCoroutineScope()和使用LaunchedEffect可组合物以使用协程/运行挂起功能(显示小吃店等)。
到目前为止,我采用的约定是记住我的 compose 树顶部的单个协程作用域,并通过函数参数将其传递到需要它的地方。这似乎是一个很好的做法,但另一方面,它给我的函数签名增加了额外的噪音。
问题
- 是否有任何理由更喜欢使用
LaunchedEffectoverrememberCoroutineScope()内部可组合函数? - 是否值得为每个撰写树只创建/记住一次协程范围,还是应该只调用
rememberCoroutineScope()实际启动协程的每个函数?
回答
在这里留下我的理解:
问题 1:
LaunchedEffect当您希望在首次启动可组合时必须采取某些操作时应使用。例如,当您想从 ViewModel 请求一些数据或运行某种动画时……
rememberCoroutineScope另一方面,特定于存储协程范围,允许代码启动某些suspend功能……恕我直言,两者之间的唯一关系它们是您还可以使用 aLaunchedEffect来启动协程...
问题 2:正如您在文档中看到的那样,rememberCoroutineScope将协程范围的引用保留在组合的特定点。因此,如果从重组中删除给定的可组合项,则该协程将自动取消。例如,您有以下可组合调用A -> B -> C。如果您记得协程作用域 inC并且它从组合中移除,协程将自动取消。但是如果你记得 from A,通过Band传递作用域C,在 中使用这个作用域C,然后C被移除,协程将继续运行(因为它在 中被记住了A)...
- Addendum: I'm using AS Arctic Fox Canary 12 and now seeing explicit warnings against using `coroutineScope.launch { ... }` inside a composable function: "Calls to launch should happen inside a LaunchedEffect and not composition." (The lint name is "CoroutineCreationDuringComposition"). So for what it's worth, this gives an 'official' directive that my previous way of using a coroutineScope for everything was not the preferred way.
THE END
二维码