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

Jetpack Compose中Dialog内AnimatedVisibility无法触发容器高度扩张问题

问题原因

该现象不是组件Bug,属于Jetpack Compose Dialog的默认测量逻辑:

  • Dialog初始化阶段会完成窗口尺寸测量,默认测量结束后窗口尺寸就固定,不会响应内部内容的尺寸变化重新调整窗口大小
  • 你给内部Column、Card添加的animateContentSize()仅能触发容器自身的尺寸变化,但外层Dialog窗口尺寸没有同步更新,所以内容超出固定窗口范围时就会出现按钮被推出可视区域的问题
解决方案

按以下步骤修改即可实现预期效果:

  1. 给Dialog传入DialogProperties参数,将*usePlatformDefaultWidth*设为false,关闭平台默认的Dialog尺寸限制,允许Dialog响应内容变化动态调整窗口尺寸
  2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:30:05