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

Jetpack Compose 应用从弹出菜单导航到其他页面/片段时崩溃问题

问题原因

这个异常的核心触发逻辑是:DropdownMenu在Compose中本质是基于PopupWindow实现的,你点击菜单项后直接同步触发了导航逻辑,当前承载页面的Fragment被立即出栈销毁,此时还没完成关闭流程的下拉菜单Popup尝试更新位置/向Window执行操作时,对应的Window已经不存在,因此抛出not attached to window manager异常。

修复方案
  • 核心原则:先保证下拉菜单完全关闭销毁,再执行导航操作
  • 具体修改代码如下:
var expanded by remember { mutableStateOf(false) }
// 获取Compose协程作用域
val scope = rememberCoroutineScope()

Icon(Icons.Default.KeyboardArrowDown, "Keyboard Arrow Down")
DropdownMenu(
    expanded = expanded,
    onDismissRequest = { expanded = false },
    modifier = Modifier
        .padding(horizontal = 24.dp)
) {
    listItems.forEachIndexed { index, label ->
        DropdownMenuItem(onClick = {
            // 先关闭下拉菜单
            expanded = false
            scope.launch {
                // 等待50ms,确保Popup已经从Window上解绑销毁
                kotlinx.coroutines.delay(50)
                // 再执行菜单选择逻辑、触发导航
                onMenuSelect(index, clientDetails.clientId)
            }
        }) {
            Text(text = label)
        }
    }
}
  • 额外优化建议:
    1. 因为你是在LazyColumn的行内使用下拉菜单,建议不要把expanded状态存在每行的remember中,行复用会导致状态混乱,可以在上层维护当前选中的行ID作为唯一状态,判断每行的菜单是否展开。
    2. 不建议在ViewModel中直接持有navManager/NavController实例,避免内存泄漏,建议通过ViewModel暴露导航事件流,在Fragment层监听事件后触发导航操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:54:04