为什么参数值相同的 requiredSizeIn 与 requiredWidthIn + requiredHeightIn 不一样?

Ely*_*lye 1 android android-jetpack-compose android-jetpack-compose-modifier

我有下面的代码

    LazyColumn(
        contentPadding = PaddingValues(all = 64.dp),
        verticalArrangement = Arrangement.spacedBy(16.dp),
    ) {
        item {
            Box(
                modifier = Modifier
                    .width(200.dp)
                    .height(200.dp)
                    .border(BorderStroke(2.dp, Color.Green))
            ) {
                Box(modifier = Modifier
                    .fillMaxSize()
                    .sizeIn(100.dp, 200.dp)
                    .requiredWidthIn(150.dp, 180.dp)
                    .requiredHeightIn(150.dp, 180.dp)
                    .border(BorderStroke(3.dp, Color.Red))
                )
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

结果正如预期的那样。

在此输入图像描述

我刚刚将requiredWidthInand替换requiredHeigthInrequiredSizeIn如下。

    LazyColumn(
        contentPadding = PaddingValues(all = 64.dp),
        verticalArrangement = Arrangement.spacedBy(16.dp),
    ) {
        item {
            Box(
                modifier = Modifier
                    .width(200.dp)
                    .height(200.dp)
                    .border(BorderStroke(2.dp, Color.Green))
            ) {
                Box(modifier = Modifier
                    .fillMaxSize()
                    .sizeIn(100.dp, 200.dp)
                    .requiredSizeIn(150.dp, 180.dp)
                    .border(BorderStroke(3.dp, Color.Red))
                )
            }
        }
Run Code Online (Sandbox Code Playgroud)

我希望结果是一样的。不知何故,它在高度方面看起来有所不同。为什么是这样?

在此输入图像描述

ian*_*ake 7

如果您查看正在使用的每种方法的定义,您会看到:

所以你的第二个代码片段实际上是这样说的:

Box(modifier = Modifier
    .fillMaxSize()
    .sizeIn(100.dp, 200.dp)
    .requiredSizeIn(
        minWidth = 150.dp,
        minHeight = 180.dp,
        maxWidth = Dp.Unspecified, // The default
        maxHeight = Dp.Unspecified, // The default
    )
    .border(BorderStroke(3.dp, Color.Red))
)
Run Code Online (Sandbox Code Playgroud)

这不是一回事 - 你没有声明任何maxWidth或像使用andmaxHeight时那样。这就是为什么你会得到不同的结果 - 你在使用时设置了a ,而在使用时设置了a 。requiredWidthInrequiredHeightInminHeight180.dprequiredSizeInminHeight150.dprequiredHeightIn

如果将所有四个参数声明为requiredSizeIn

Box(modifier = Modifier
    .fillMaxSize()
    .sizeIn(100.dp, 200.dp)
    .requiredSizeIn(
        minWidth = 150.dp,
        minHeight = 150.dp,
        maxWidth = 180.dp,
        maxHeight = 180.dp
    )
    .border(BorderStroke(3.dp, Color.Red))
)
Run Code Online (Sandbox Code Playgroud)