如何在Jetpack Compose的AndroidView中使用LaunchEffect?
修复方案
方案1:使用update块响应状态变化(更推荐)
AndroidView自带的update块属于Composable作用域,可以直接监听StateFlow变化并更新原生View,无需手动调用LaunchedEffect收集:
@Composable fun CustomAndroidView(viewModel: MyViewModel = viewModel()) { AndroidView( factory = { context -> // 仅做原生View初始化操作 MyNativeView(context) }, update = { nativeView -> // 绑定生命周期收集StateFlow,状态变更自动触发更新 val viewState by viewModel.stateFlow.collectAsStateWithLifecycle() nativeView.renderState(viewState) } ) }
注意:使用
collectAsStateWithLifecycle需要引入依赖:androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0+
方案2:在外层作用域使用LaunchedEffect
如果有必须在LaunchedEffect中收集的需求,将LaunchedEffect移到AndroidView外层的Composable作用域,同时用remember保存原生View的引用:
@Composable fun CustomAndroidView(viewModel: MyViewModel = viewModel()) { // 保存原生View引用 var nativeView: MyNativeView? by remember { mutableStateOf(null) } // LaunchedEffect放在外层Composable作用域 LaunchedEffect(Unit) { viewModel.stateFlow.collect { state -> nativeView?.renderState(state) } } AndroidView( factory = { context -> MyNativeView(context).also { nativeView = it } } ) }
注意事项
- 永远不要在
AndroidView的factory块中调用任何带@Composable注解的函数 - 收集StateFlow时优先使用
collectAsStateWithLifecycle,可以自动绑定Android生命周期避免内存泄漏
内容的提问来源于stack exchange,提问作者Saeed Noshadi
相关产品推荐
相关产品推荐

