android - 使用 rememberCoroutineScope() 与 LaunchedEffect

标签 android kotlin kotlin-coroutines android-jetpack-compose

语境
在 Jetpack compose 中,我们可以选择使用 rememberCoroutineScope()以及使用 LaunchedEffect可组合以使用协程/运行挂起功能(显示 snackbar 等)。
到目前为止,我采用的约定是在我的 compose 树的顶部记住一个协程范围,并通过函数参数将它传递到需要它的地方。这似乎是一种很好的做法,但另一方面,它给我的函数签名增加了额外的噪音。
问题

  • 有什么理由更喜欢使用 LaunchedEffect超过 rememberCoroutineScope()在可组合函数内部?
  • 是否值得为每个 compose 树只​​创建/记住一次协程范围,还是应该调用 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/

    相关文章:

    android - Kotlin Android Firebase 数据库 Hashmap 转换为类

    android - 请求增量注释处理

    kotlin - 在 Kotlin 中锁定互斥锁的正确方法

    android - 在 android 的 google play 上处理注册?

    android - 使用 Google Map API 通过语音控制进行 tbt 导航

    android - 虽然 Android Studio 更新到 v3.3 获取 API 'variant.getAssemble()' 已过时并已替换为 'variant.getAssembleProvider()'

    java - 将 http 407 错误作为 IOException

    kotlin - 为什么作者需要用 viewModelScope.launch 包装一个非挂起函数?

    kotlin - 在流的收集中获取当前和以前的值

    android - 在单个作业中执行两个不同的操作