Dropdown Menu已打开时重复弹出,无法关闭问题求助
你的问题出在布局结构上:你把IconButton和DropdownMenu放在了Column中,当菜单展开时,会占据额外的布局空间,导致Column高度增加,IconButton的位置被向上推。当你点击菜单项关闭菜单后,Column收缩,IconButton回到初始位置——如果你的点击位置刚好落在按钮的新位置(也就是原来的位置),就会再次触发按钮的点击事件,把expanded重新设为true,导致菜单自动弹出。
修复方案
将Column替换为Box,让DropdownMenu覆盖在IconButton上方,而不是改变按钮的位置:
@Composable fun MyComponent() { val items = listOf("Option 1", "Option 2", "Option 3") var selectedIndex by remember { mutableStateOf(0) } var expanded by remember { mutableStateOf(false) } Box { // 用Box替代Column IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "Menu") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, modifier = Modifier.background(Color.White) ) { items.forEachIndexed { index, item -> DropdownMenuItem( onClick = { selectedIndex = index expanded = false } ) { Text(text = item) } } } } }
如果使用的是Jetpack Compose 1.4及以上版本,还可以使用DropdownMenu的anchor参数,更明确地关联触发按钮,避免布局问题:
@Composable fun MyComponent() { val items = listOf("Option 1", "Option 2", "Option 3") var selectedIndex by remember { mutableStateOf(0) } var expanded by remember { mutableStateOf(false) } val iconButtonAnchor = remember { AnchorTypeProvider() } Box { IconButton( onClick = { expanded = !expanded }, modifier = Modifier.anchorProvider(iconButtonAnchor) ) { Icon(Icons.Default.MoreVert, contentDescription = "Menu") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, modifier = Modifier.background(Color.White), anchor = iconButtonAnchor // 关联按钮作为锚点 ) { items.forEachIndexed { index, item -> DropdownMenuItem( onClick = { selectedIndex = index expanded = false } ) { Text(text = item) } } } } }
另外,确认没有其他逻辑意外修改expanded的值——既然你已经尝试将状态移入类中管理,说明状态本身的保存没有问题,核心问题就是布局导致的误触发。
内容的提问来源于stack exchange,提问作者abasirwani
相关产品推荐
相关产品推荐

