Compose中无尺寸约束Box的异常表现:子Box尺寸影响差异
问题
在以下Jetpack Compose代码中,修改蓝色Box的height值时,红色Box的height会随之变化;但修改蓝色Box的width值时,红色Box的width却不受影响。红色Box的size约束已被注释,请问该现象的原因是什么?
@Composable fun ScreenSize() { Column( modifier = Modifier.size(400.dp) ) { BoxWithConstraints( modifier = Modifier //.size(300.dp) .background(Color.Red), ) { Text( text = "mxwidth: $maxWidth, mnwidth: $minWidth," + " mxheight: $maxHeight, mnheight: $minHeight", modifier = Modifier.align(Alignment.TopStart) ) BoxWithConstraints( modifier = Modifier .size(width = 200.dp, height = 200.dp) .background(Color.Blue) .align(Alignment.CenterStart) ) { Text( text = "mxwidth: $maxWidth, mnwidth: $minWidth, mxheight: $maxHeight, mnheight: $minHeight", modifier = Modifier.align(Alignment.BottomEnd) ) } } } }
代码运行结果:
原因分析
这是Jetpack Compose布局约束传递规则和BoxWithConstraints尺寸计算逻辑共同作用的结果:
宽度维度:父布局固定约束限制
父布局是固定size(400.dp)的Column,它会给子元素(红色BoxWithConstraints)传递固定的最大宽度约束(即自身的400dp宽度)。红色Box没有设置固定宽度,会直接继承这个约束,内部蓝色Box的宽度只是在红色Box的宽度范围内摆放,不会改变红色Box的宽度上限。高度维度:子元素尺寸决定父容器高度
Column在垂直方向没有给红色Box传递固定高度约束,红色Box的高度会由内部所有子元素的高度和布局方式决定。蓝色Box的高度变化会直接影响红色Box的整体高度,因为红色Box需要完全容纳内部的蓝色Box和文本元素。BoxWithConstraints的特性
这个容器的尺寸由父布局约束和内部子元素共同决定:水平方向受父布局固定约束限制,垂直方向则根据内部内容自适应,所以会出现修改蓝色Box高度影响红色Box高度,但宽度无影响的现象。
内容的提问来源于stack exchange,提问作者ntos
相关产品推荐
相关产品推荐

