我可以使用状态流
val items by myViewModel.items.collectAsState()
字符串我想共享流不能这样使用,共享流是否也适用于编写?
zwghvu4y1#
SharedFlow应用于一次性事件(导航、吐司等)。这是收集SharedFlow的方法:
@Composablefun <T> Flow<T>.collectAsEffect( context: CoroutineContext = EmptyCoroutineContext, block: (T) -> Unit) { LaunchedEffect(key1 = Unit) { onEach(block).flowOn(context).launchIn(this) }}
@Composable
fun <T> Flow<T>.collectAsEffect(
context: CoroutineContext = EmptyCoroutineContext,
block: (T) -> Unit
) {
LaunchedEffect(key1 = Unit) {
onEach(block).flowOn(context).launchIn(this)
}
字符串
vshtjzan2#
从技术上讲,您可以将其作为任何其他Flow的状态进行收集-使用初始值:
Flow
flow.collectAsState(initial = 0)
字符串这个状态将具有在视图呈现期间流发出的最后一个值,或者初始值。但是您也可以将其用作交付需要一次性响应的事件的方法,如this answer所示。
ruyhziif3#
只需将LaunchedEffect与repeatOnLifecycle配合使用。如果不使用repeatOnLifecycle,即使应用程序在后台运行,也会收集您的流。Eg.
@Composablefun YourFunction() { val lifecycleOwner = LocalLifecycleOwner.current LaunchedEffect(Unit) { repeatOnLifecycle(Lifecycle.State.STARTED) { withContext(Dispatchers.Main.immediate) { sharedFlow .collect { /* doSomething */ } } } }}
fun YourFunction() {
val lifecycleOwner = LocalLifecycleOwner.current
LaunchedEffect(Unit) {
repeatOnLifecycle(Lifecycle.State.STARTED) {
withContext(Dispatchers.Main.immediate) {
sharedFlow
.collect { /* doSomething */ }
字符串无论如何,我建议使用通道,而不是共享流,如果流只收集在一个地方,因为它有内置的缓冲区,所以你不会错过任何事件。您可以在Philipp Lackner视频中找到有关Jetpack Composes中一次性事件的更多说明
3条答案
按热度按时间zwghvu4y1#
SharedFlow应用于一次性事件(导航、吐司等)。
这是收集SharedFlow的方法:
字符串
vshtjzan2#
从技术上讲,您可以将其作为任何其他
Flow
的状态进行收集-使用初始值:字符串
这个状态将具有在视图呈现期间流发出的最后一个值,或者初始值。
但是您也可以将其用作交付需要一次性响应的事件的方法,如this answer所示。
ruyhziif3#
只需将LaunchedEffect与repeatOnLifecycle配合使用。如果不使用repeatOnLifecycle,即使应用程序在后台运行,也会收集您的流。
Eg.
字符串
无论如何,我建议使用通道,而不是共享流,如果流只收集在一个地方,因为它有内置的缓冲区,所以你不会错过任何事件。
您可以在Philipp Lackner视频中找到有关Jetpack Composes中一次性事件的更多说明