Jetpack Compose中Dialog内AnimatedVisibility无法触发容器高度扩张问题
问题原因
该现象不是组件Bug,属于Jetpack Compose Dialog的默认测量逻辑:
- Dialog初始化阶段会完成窗口尺寸测量,默认测量结束后窗口尺寸就固定,不会响应内部内容的尺寸变化重新调整窗口大小
- 你给内部Column、Card添加的
animateContentSize()仅能触发容器自身的尺寸变化,但外层Dialog窗口尺寸没有同步更新,所以内容超出固定窗口范围时就会出现按钮被推出可视区域的问题
解决方案
按以下步骤修改即可实现预期效果:
- 给Dialog传入
DialogProperties参数,将*usePlatformDefaultWidth*设为false,关闭平台默认的Dialog尺寸限制,允许Dialog响应内容变化动态调整窗口尺寸 - 给Dialog的直接子布局(即示例中的Card)添加
wrapContentSize()修饰符允许其自适应内容大小,再搭配animateContentSize()实现尺寸变化的过渡动画
修改后完整代码如下:
@Composable private fun ShowDialog() { var showText by remember { mutableStateOf(false) } val text = if (showText) { "Hide Text" } else { "Show Text" } Dialog( onDismissRequest = { }, // 新增Dialog配置,允许动态调整尺寸 properties = DialogProperties(usePlatformDefaultWidth = false) ) { Card( modifier = Modifier .padding(15.dp) .wrapContentSize() .animateContentSize() ) { Column(modifier = Modifier.padding(15.dp)) { AnimatedVisibility(visible = showText) { Text( text = "Here is the show text sample", modifier = Modifier.padding(5.dp), style = MaterialTheme.typography.body1, color = Color.Black ) } Button(onClick = { showText = !showText }) { Text(text = text) } } } } }
如果需要限制Dialog的最大宽度避免在大屏设备上显示过宽,可在Card的修饰符中添加requiredWidthIn(max = 320.dp)这类尺寸限制,不会影响自适应逻辑。
内容的提问来源于stack exchange,提问作者AgentP
相关产品推荐
相关产品推荐

