最近,许多人发现调用collectAsStateWithLifecycle()时,无法在组合内部正确收集数据,导致其无法更新UI。但是,它可以正常工作在组件和非UI状态流中。这可能是由于组合组件的生命周期不同于常规组件。解决此问题的常见方法是使用LaunchedEffect。以下是一个示例:
@Composable
fun MyComposable(viewModel: MyViewModel) {
val myData by viewModel.myDataFlow.collectAsState()
LaunchedEffect(viewModel) {
viewModel.subscribeToMyDataFlow()
}
Text(text = myData)
}
在这个例子中,我们使用了LaunchedEffect来订阅MyDataFlow。这样,每当ViewModel更新时,LaunchedEffect都会重启,并且新的数据将在这里传递到组件,这样我们就可以在组合中正确收集数据了。