Android Fragments 如何从视图模型中收集流并在可组合对象中操作它们?

l3zydbqr  于 2023-01-13  发布在  Android
关注(0)|答案(1)|浏览(168)

视图模型:

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函数的上下文发生 *
从视图模型收集流并在可组合对象中操作它们的最佳实践是什么?

62lalag4

62lalag41#

最好使用扩展名- Flow.collectAsState()
在您的情况下,它将是:

val screenState = rulesVm.sharedFlow.collectAsState

然后在一个可组合函数的函数体中你可以这样做:

@Composable
fun EventListener(
rulesVm: RulesViewModel,
) {
    val screenState = rulesVm.sharedFlow.collectAsState()
    
    when(screenState) {
             is RulesViewModel.ScreenEvents.ShowSnackbar -> {
                 SnackbarScreen("snackbar ${event.message}")
             }
             is RulesViewModel.ScreenEvents.Navigate -> {
                 // todo
             }
    }
}

不能在LaunchedEffect主体和Flow.collect()中调用可组合函数,因为它是协程作用域的扩展,而不是可组合函数。

相关问题