You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:20:38