视图模型:
class RulesViewModel : ViewModel() {
private val _sharedFlow = MutableSharedFlow<ScreenEvents>()
val sharedFlow = _sharedFlow.asSharedFlow()
sealed class ScreenEvents {
data class ShowSnackbar(val message: String) : ScreenEvents()
data class Navigate(val route: String) : ScreenEvents()
}
}
可组合:
@Composable
fun EventListener(
rulesVm: RulesViewModel,
) {
LaunchedEffect(key1 = true) {
rulesVm.sharedFlow.collect { event ->
when(event) {
is RulesViewModel.ScreenEvents.ShowSnackbar -> {
SnackbarScreen("snackbar ${event.message}")
}
is RulesViewModel.ScreenEvents.Navigate -> {
// todo
}
}
}
}
}
这将显示错误消息:*@Composable调用只能从@Composable函数的上下文发生 *
从视图模型收集流并在可组合对象中操作它们的最佳实践是什么?
1条答案
按热度按时间62lalag41#
最好使用扩展名- Flow.collectAsState()
在您的情况下,它将是:
然后在一个可组合函数的函数体中你可以这样做:
不能在LaunchedEffect主体和Flow.collect()中调用可组合函数,因为它是协程作用域的扩展,而不是可组合函数。