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

如何在Android Jetpack Compose中通过事件有效销毁并关闭Popup组件

在Android Jetpack Compose中正确销毁关闭Popup组件的方案

直接通过布尔标记showOverlay的条件渲染控制Popup显示隐藏时,会触发如下输入通道未正确清理的警告:

Input channel object '5668e46 Pop-Up Window (client)' was disposed without first being removed with the input manager!

问题原因

用if (showOverlay)包裹Popup的方式,会在状态切换时直接销毁Popup组件实例,跳过了Popup内部处理输入通道移除的流程,导致系统抛出警告。

解决方案

改用Popup组件自带的visible参数控制显示状态,让组件内部完成正确的销毁逻辑:

修改后的完整代码:

// 假设showOverlay是通过remember或ViewModel管理的可观察状态
var showOverlay by remember { mutableStateOf(false) }

// 无需外层if判断,直接通过visible参数控制
Popup(
    visible = showOverlay,
    onDismissRequest = {
        showOverlay = false
    },
    offset = IntOffset(
        LocalConfiguration.current.screenWidthDp, buttonPosition.y.toInt() + 48
    )
) {
    Box(
        modifier = Modifier
            .background(Color.LightGray.copy(alpha = 0.7F))
            .padding(16.dp)
    ) {
        // 这里填充Popup内容
    }
}

关键修改说明

  • 移除外层的if (showOverlay)条件判断,使用Popup内置的visible参数绑定状态
  • 当showOverlay切换为false时,Popup会自动执行内部的输入通道清理流程,彻底销毁组件同时避免警告
  • 手动触发关闭(比如点击Popup内按钮)时,只需修改showOverlay状态即可,Popup会自动响应

内容的提问来源于stack exchange,提问作者Muhammad Haroon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:27:17