使用Compose UI实现Toast时崩溃:ViewTreeLifecycleOwner未找到
解决ComposeView在Toast中崩溃的问题(viewtreelifecycleowner not found异常)
问题场景
点击按钮显示自定义Compose布局的Toast时,应用崩溃并抛出异常:viewtreelifecycleowner not found from androidx.compose.ui.platform.composeview
原代码如下:
val context = LocalContext.current Button(onClick = { val toast = android.widget.Toast(context) val composeView = ComposeView(context) composeView.setContent { ToastUi() } toast.view = composeView toast.show() }) { Text(text = "Show toast") } @Composable fun ToastUi() { Row { Icon(painter = painterResource(id = R.drawable.ic_success_colored),"") Spacer(modifier = Modifier.width(12.dp)) Text("sample") } }
问题原因
ComposeView运行需要绑定ViewTreeLifecycleOwner等生命周期相关上下文,直接用普通Context创建的ComposeView没有关联任何生命周期所有者,且Toast的视图不会自动加入Activity的视图树,导致Compose无法获取必要的运行依赖。
修复方案
手动给ComposeView绑定Activity的生命周期相关实例,修复后的代码:
val context = LocalContext.current val activity = context as AppCompatActivity Button(onClick = { val toast = android.widget.Toast(context) val composeView = ComposeView(context).apply { // 绑定Activity的生命周期所有者 setViewTreeLifecycleOwner(activity) // 绑定ViewModel存储所有者 setViewTreeViewModelStoreOwner(activity) // 绑定状态存储所有者 setViewTreeSavedStateRegistryOwner(activity) setContent { ToastUi() } } toast.view = composeView toast.duration = Toast.LENGTH_SHORT toast.show() }) { Text(text = "Show toast") } @Composable fun ToastUi() { Row( modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically ) { Icon(painter = painterResource(id = R.drawable.ic_success_colored), contentDescription = "成功图标") Spacer(modifier = Modifier.width(12.dp)) Text("sample") } }
关键说明
- 确保当前
Context是Activity实例(如果在Fragment中,可替换为requireActivity()) - 必须给ComposeView设置
ViewTreeLifecycleOwner等三个核心依赖,否则Compose无法正常渲染 - 可通过
Modifier.padding优化Toast内容的显示间距
内容的提问来源于stack exchange,提问作者Himanshu Khanna
相关产品推荐
相关产品推荐

