AppCompatActivity中BottomSheetDialog嵌入ComposeView抛异常如何解决
异常产生原因
Jetpack Compose 的 ComposeView 必须依赖 View 树中存在的 ViewTreeLifecycleOwner、ViewTreeSavedStateRegistryOwner 组件,才能正常管理重组生命周期、保存页面状态。你当前使用的 androidx.appcompat:appcompat:1.3.1 版本中,BottomSheetDialog 默认不会自动给内容布局设置上述必要的Owner组件,因此 ComposeView 挂载到Window时找不到依赖项就抛出该异常。
解决方案
- 方案1:升级AppCompat依赖到1.4.0及以上版本
从AppCompat 1.4.0版本开始,所有AppCompat旗下的Dialog子类都会自动给内容视图注入需要的ViewTreeOwner,升级后原有代码无需修改即可正常运行,只需将依赖配置修改为androidx.appcompat:appcompat:1.4.0或更高稳定版本即可。 - 方案2:手动给ComposeView注入必要的Owner
如果暂时不能升级AppCompat版本,可以直接在构造ComposeView时手动设置Owner,修改后的代码如下:
val bottomSheet = BottomSheetDialog(this) val composeView = ComposeView(this).apply { // 此处替换为你当前的Activity实例 setViewTreeLifecycleOwner(this@YourActivity) setViewTreeSavedStateRegistryOwner(this@YourActivity) setContent { MaterialTheme { Test() } } } bottomSheet.setContentView(composeView) bottomSheet.show()
- 方案3:使用纯Compose实现的底部弹窗
直接在Compose代码中使用官方提供的ModalBottomSheetLayout组件实现底部弹窗,不需要混合使用原生Dialog和ComposeView,从根源避免适配问题。
内容的提问来源于stack exchange,提问作者Georg
相关产品推荐
相关产品推荐

