如何在Compose绘制到UI界面前获取其尺寸?
在Compose绘制前获取组件宽高的可行方案
完全可以实现,核心是介入Compose的测量阶段来获取尺寸,而不是等到放置阶段(你用的onPlaced属于放置阶段,此时布局已确定,组件即将开始绘制)。
具体操作方式:
使用
Modifier.layout自定义布局逻辑
这个Modifier能让你直接参与子组件的测量和布局流程,在测量完成后就能拿到宽高,此时还未进入绘制阶段,修改不会引发先绘制再更新的问题。示例代码:Modifier.layout { measurable, constraints -> // 先完成子组件的测量 val placeable = measurable.measure(constraints) // 这里直接获取宽高:placeable.width、placeable.height // 可根据尺寸做任意逻辑处理,比如调整布局位置、修改子组件约束等 // 完成布局放置 layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) } }结合状态保存尺寸(跨组件使用场景)
如果需要把获取到的尺寸传递给其他组件,用remember配合MutableState存储即可,状态更新会触发重组,但因为尺寸是在测量阶段拿到的,重组后会重新走测量流程,不会出现先绘制再变化的情况:val componentSize = remember { mutableStateOf(IntSize.Zero) } Box( modifier = Modifier.layout { measurable, constraints -> val placeable = measurable.measure(constraints) // 保存尺寸到状态 componentSize.value = IntSize(placeable.width, placeable.height) layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) } } ) { // 组件内容 } // 其他组件可直接读取状态中的尺寸 Text("当前组件宽度:${componentSize.value.width}")
为什么onPlaced不符合需求?
onPlaced的回调时机是组件被放置到父布局之后,此时整个布局流程已经结束,组件即将或已经开始绘制。这时候再用拿到的尺寸修改UI,会触发二次重组,导致组件先绘制一次旧状态,再更新成新状态,出现视觉闪烁。
内容的提问来源于stack exchange,提问作者Barrufet
相关产品推荐
相关产品推荐

