android 如何在Jetpack Compose中使用SharedFlow

neekobn8  于 2024-01-04  发布在  Android
关注(0)|答案(3)|浏览(228)

我可以使用状态流

  1. val items by myViewModel.items.collectAsState()

字符串
我想共享流不能这样使用,共享流是否也适用于编写?

zwghvu4y

zwghvu4y1#

SharedFlow应用于一次性事件(导航、吐司等)。
这是收集SharedFlow的方法:

  1. @Composable
  2. fun <T> Flow<T>.collectAsEffect(
  3. context: CoroutineContext = EmptyCoroutineContext,
  4. block: (T) -> Unit
  5. ) {
  6. LaunchedEffect(key1 = Unit) {
  7. onEach(block).flowOn(context).launchIn(this)
  8. }
  9. }

字符串

vshtjzan

vshtjzan2#

从技术上讲,您可以将其作为任何其他Flow的状态进行收集-使用初始值:

  1. flow.collectAsState(initial = 0)

字符串
这个状态将具有在视图呈现期间流发出的最后一个值,或者初始值。
但是您也可以将其用作交付需要一次性响应的事件的方法,如this answer所示。

ruyhziif

ruyhziif3#

只需将LaunchedEffect与repeatOnLifecycle配合使用。如果不使用repeatOnLifecycle,即使应用程序在后台运行,也会收集您的流。
Eg.

  1. @Composable
  2. fun YourFunction() {
  3. val lifecycleOwner = LocalLifecycleOwner.current
  4. LaunchedEffect(Unit) {
  5. repeatOnLifecycle(Lifecycle.State.STARTED) {
  6. withContext(Dispatchers.Main.immediate) {
  7. sharedFlow
  8. .collect { /* doSomething */ }
  9. }
  10. }
  11. }
  12. }

字符串
无论如何,我建议使用通道,而不是共享流,如果流只收集在一个地方,因为它有内置的缓冲区,所以你不会错过任何事件。
您可以在Philipp Lackner视频中找到有关Jetpack Composes中一次性事件的更多说明

展开查看全部

相关问题