【问题标题】:What's difference "modifier" and "Modifier" (Kotlin Android, Jetpack Compose)“修饰符”和“修饰符”有什么区别(Kotlin Android,Jetpack Compose)
【发布时间】:2021-09-19 15:24:55
【问题描述】:

代码参考:https://www.youtube.com/watch?v=Kw4_i4l5y4s&ab_channel=PhilippLackner

我对此代码有两个问题

@Composable
fun ProfileSection(
    modifier: Modifier = Modifier
) {
    Column(modifier = Modifier.fillMaxWidth()) {
        Row(
            verticalAlignment = Alignment.CenterVertically,
            modifier = Modifier
                .fillMaxWidth()
                .padding(horizontal = 20.dp)
        ){
            RoundImage(
                image = painterResource(id = R.drawable.messi1),
                modifier = Modifier
                    .size(100.dp)
                    .weight(3f)
            )
            Spacer(modifier = Modifier.width(16.dp))
            StatSection(modifier = Modifier.weight(7f))
        }
    }
}

[第3行]首先是为什么使用'修饰符:修饰符=修饰符'?它到底有什么作用?

[第5行]第二个“m”修饰符和“M”修饰符有什么区别?将修饰符更改为修饰符时,不会出现代码错误(红色下划线)。结果不是我想要的。

【问题讨论】:

    标签: android android-jetpack-compose android-jetpack


    【解决方案1】:

    你明白int: Int = 0吗?与此相同。第一个 int 是我们的名字(它可以是我们想要的任何东西)。冒号后的第二个 Int 是我们的类型,我们希望 int 保存的数据类型。第三个是值,在本例中为 0

    modifier是参数名称,Modifier是类型,Modifier是值。现在您可能对 Modifier 本身就是 Modifier 类型的对象这一事实感到困惑,但不要为此感到紧张。它是一个伴生对象,因此您既可以将其用作对象类型,也可以将其用作对象本身。

    此外,如您所见,Kotlin 可以根据提供的值推断类型,您甚至可以在此处跳过类型。例如,在var int: Int = 0 中,Int 是多余的。 Kotlin 会知道类型是 Int,因为我们已经分配了该类型的值(0,是整数)。所以,我们可以把它写成:var int = 0

    但是,参数不是这样的,也就是说,如果所关注的实体是函数的参数,你仍然必须指定类型,即使你分配了一个值。

    因此,在您的示例中,

    fun ProfileSection(
        modifier: Modifier = Modifier
    ) { ... }
    

    【讨论】:

    • 但是“修饰符:修饰符=修饰符”的目的是什么?既然我可以随时随地使用 Modifier.xxx,为什么我需要定义一个“修饰符”,而不仅仅是使用“修饰符”?
    • 嗯,你看 hon',这里的 modifier 是作为参数提供的,这样 Composable 的调用者也可以根据需要传递自己的修改,例如,调用站点可能有这个调用ProfileSection(modifier = Modifier.height(500.dp).width(1000.dp)
    • 这是正确的细分。 modifier 这个词是参数的名称,可以是任何你想要的,但按照惯例,我们总是将它命名为 - 修饰符。冒号 (:) 后面的 Modifier 用于指定参数的类型,在参数的情况下这是强制性的,'equals' 后面的 Modifier 只是为了指定参数的默认值。
    • Kotlin 是这样工作的——如果你在一个函数中创建一个参数,首先你必须总是通过指定冒号来指定参数的类型,然后如果你希望参数是 COMPULSORY在打电话的时候被喂进去,你就这样离开它——一个名字和一个类型。但是,如果您希望能够处理调用站点未明确指定参数的情况,请为参数提供一个 DEFAULT 值,在这种情况下,modifier: Modifier = Modifier,其中Modifier 是您的默认值。
    • 现在,你也可以像 ProfileSection(/*No Need to Specify a Modifier, the default one will be taken*/) 这样调用 Composable。如果您仍然想进行修改,您可以直接指定一个修饰符,如我之前提到的 ProfileSection(modifier = Modifier.height(500.dp).width(1000.dp)
    猜你喜欢
    • 2020-08-25
    • 2021-01-20
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多