如果确实需要原始大小值,可以使用以下代码:
var size by remember { mutableStateOf(IntSize.Zero) }
Box(Modifier
.fillMaxSize()
.background(Color.Yellow)
.onSizeChanged {
size = it
}
) {
Box(
Modifier
.then(
with(LocalDensity.current) {
Modifier.size(
width = size.width.toDp(),
height = size.height.toDp(),
)
}
)
.background(Color.Blue)
) { Text("Test") }
}
但请注意,这在性能方面并不是最优的:此视图会被渲染两次。第一次第二个框的大小为零,然后调用onSizeChanged 块,然后第二次渲染视图。
如果在顶级视图中使用remember,请特别小心,因为更改状态会触发完整视图堆栈重新渲染。通常您希望将屏幕拆分为具有状态的视图,因此仅更改一个视图状态会重新呈现该视图。
您还可以使用BoxWithConstraints,您可以在BoxWithConstraintsScope 中获得maxWidth/maxHeight:它的代码更少,性能也更好。
BoxWithConstraints(
Modifier
.fillMaxSize()
.background(Color.Yellow)
) {
Box(
Modifier
.size(
width = maxWidth,
height = maxHeight,
)
.background(Color.Blue)
) { Text("Test") }
}
但通常如果您想指示大小依赖关系,使用不直接知道大小的修饰符就足够了。这是一种更“组合”的代码编写方式和更优化的方式。
所以如果你想让你的第二个盒子和第一个一样大,也可以在上面使用.fillMaxSize()。如果你想让它成为父母的一部分,你可以添加分数参数。要使第二个盒子大小是第一个盒子大小的一半,您可以:
Box(
Modifier
.fillMaxSize(fraction = 0.5f)
) { Text("Test") }
如果你想要不同的宽度/高度部分:
Box(
Modifier
.fillMaxWidth(fraction = 0.3f)
.fillMaxHeight(fraction = 0.7f)
) { Text("Test") }