Compose:LazyColumn内可展开Card初始高度设为50dp的问题
解决Compose LazyColumn中可展开Card的高度问题
核心问题是你同时使用height(50dp)和heightIn的方式错误,而且heightIn的max参数不能直接传WrapContentHeight。正确的做法是根据展开状态动态切换高度修饰符:
基础实现(无动画)
直接根据展开状态判断,未展开时固定50dp高度,展开后自适应内容:
val isExpanded by remember { mutableStateOf(false) } Card( modifier = Modifier .clickable { isExpanded = !isExpanded } .then( if (isExpanded) { Modifier.wrapContentHeight() } else { Modifier.height(50.dp) } ), elevation = 4.dp ) { Column( modifier = Modifier.padding(16.dp) ) { Text("标题行") if (isExpanded) { Text("展开后的内容,这里可以放任意长度的文本或组件") Text("多行内容示例") } } }
带动画的平滑过渡(推荐)
如果需要展开/收起时有平滑的高度动画,可以用animateDpAsState,指定展开时用Dp.Unspecified(等价于自适应高度):
val isExpanded by remember { mutableStateOf(false) } val targetHeight by animateDpAsState( targetValue = if (isExpanded) Dp.Unspecified else 50.dp, animationSpec = tween(300) ) Card( modifier = Modifier .clickable { isExpanded = !isExpanded } .height(targetHeight), elevation = 4.dp ) { Column( modifier = Modifier.padding(16.dp) ) { Text("标题行") if (isExpanded) { Text("展开后的内容,这里可以放任意长度的文本或组件") Text("多行内容示例") } } }
为什么原写法无效?
height(50dp)是强制固定高度,但你后面又加了heightIn,Modifier的顺序会导致后加的规则覆盖前面的,而且heightIn的max参数接受的是具体数值,WrapContentHeight不是合法参数。- 即使去掉
height(50dp),heightIn(min=50dp, max=...)也不会让初始高度固定为50dp——它只是限制高度范围,组件还是会优先适应内容高度,所以初始状态下内容如果超过50dp,高度会直接自适应。
内容的提问来源于stack exchange,提问作者AlaaEddin Albarghoth
相关产品推荐
相关产品推荐

