这是我有生以来第一次学习编程,我已经花了大约两周的时间通过免费课程学习Kotlin,特别是在Android Studio中学习了一周的Jetpack Compose.我已经坚持了两天的Noobie实践,但我在互联网上遇到的每一个答案都假设我知道的比我知道的要多.这种做法是让象限像这样的CorrectQuadrant,但除非我做了一个对我来说没有意义的改变,否则我只能得到像这样的IncorrectQuadrant.

所以问题是我不太理解修饰符参数,所以试了又试,最后我下载了解决方案代码并找到了错误,但我不明白为什么是错误.在下面的代码中,在私有函数"ComposeInfoCard"中,您可以看到用(=)括起来的修饰符列参数.如果我用小写形式写参数(修饰符=修饰符),我会得到正确的象限.如果我按原样编写(Modify=Modify),这就是我认为它是正确的,私有函数中的Modify参数显示"参数Modify永远不会被使用",但事实并非如此,因为我在Compose象限函数中将其用于权重修饰符4次.

有人能解释一下为什么它必须是小写的吗?如果你不介意的话,可以解释一下对象修饰符,就像我在编程方面是一个彻头彻尾的新手和智障一样?谢谢.

@Composable
fun ComposeQuadrant(){
    Column (modifier = Modifier.fillMaxWidth()){
        Row (modifier = Modifier.weight(1f)){
            ComposeInfoCard(
                title = stringResource(R.string.title1),
                description = stringResource(R.string.description1),
                backgroundColor = Color(0xFFEADDFF),
                modifier = Modifier.weight(1f)
            )
            ComposeInfoCard(
                title = stringResource(R.string.title2),
                description = stringResource(R.string.description2),
                backgroundColor = Color(0xFFD0BCFF),
                modifier = Modifier.weight(1f)
            )

        }
        Row (Modifier.weight(1f)){
            ComposeInfoCard(
                title = stringResource(R.string.title3),
                description = stringResource(R.string.description3),
                backgroundColor = Color(0xFFB69DF8),
                modifier = Modifier.weight(1f)
            )
            ComposeInfoCard(
                title = stringResource(R.string.title4),
                description = stringResource(R.string.description4),
                backgroundColor = Color(0xFFF6EDFF),
                modifier = Modifier.weight(1f)
            )

        }
    }

}
@Composable
private fun ComposeInfoCard(
    title: String,
    description: String,
    backgroundColor: Color,
    modifier: Modifier = Modifier) {
=========================================================
    Column (modifier = Modifier
=========================================================
        .padding(16.dp)
        .background(backgroundColor)
        .fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ){
        Text(
            text = title,
            fontWeight = FontWeight.Bold,
            modifier = Modifier.padding(bottom = 16.dp)
        )
        Text(
            text = description,
            textAlign = TextAlign.Justify
        )

    }

}

推荐答案

Short-Explaination:modifier小写是在ComposeQuadrant中创建的现有修改量,属性权重为1f.当您使用Modifier大写时,您将创建一个新的修改器对象,因此它不具有以前的该权重属性.

Long-Explaination:

  1. 了解Kotline中的函数 考虑一个向某人打印问候语的函数.它需要两个输入参数,问候语和问候对象的姓名.

Arguments-这些是您在调用函数时提供的输入,然后函数可以使用输入变量.但是,我们需要定义这些变量的数据类型参数,即它是字符串还是整数等.

fun greetMe(greeting : String, name : String) {
    print("$greeting to $name") 
    // the name used here is the one that I get from the code that calls this function
}

现在,我们调用该函数

greetMe("Hi", "Pawan")

输出为

Hi to Pawan
  1. 了解Kotlin中的命名参数

现在,假设以这种方式调用相同的greetMe函数

greetMe("Pawan", "Hi")

输出为

Pawan to Hi

代码实现有什么问题吗?不是的!因为"Pawan"和"Hi"都是字符串,这是函数所需要的.但这在逻辑上是正确的吗?不是的!因为我们以错误的顺序提供了输入.为了处理这个问题,我们使用命名参数,并以这种方式调用函数

greetMe(name = "Pawan", greeting = "Hi")

虽然我们提供的输入序列是错误的,但是输出是正确的,因为我们使用了命名参数,所以现在它们将被映射到正确的变量.

Hi to Pawan

现在来质疑一下...

ComposeInfoCard(modifier = Modifier.weight(1f))

在这里,您调用ComposeInfoCard并使用命名参数.创建一个新的修改器对象,更改其属性,即将权重设置为1f.

private fun ComposeInfoCard(modifier: Modifier = Modifier) {
}

好的,我希望你们现在明白了前modifier条,它是一个命名参数,而不是一个变量.上面的代码行说明您将获得一个修饰符作为参数 它的数据类型将是Modifier.=符号后面的部分是我们所称的缺省值,即如果调用函数没有提供修饰符,则使用这个修饰符,在本例中是一个新修饰符.

现在,在您的ComposeInfoCard方法中,您有一个修饰符变量,该变量由调用函数提供.

private fun ComposeInfoCard(
    // modifer that you get here is not used anywhere
    modifier: Modifier = Modifier) {
    Column (modifier = Modifier // because here you are creating a new modifier
        .background(backgroundColor)
        .fillMaxSize()
   )

现在你在这里调用另一个函数,它是Column,它也需要一个修饰符,你已经创建了一个新的Modifier对象,并改变了背景 colored颜色 .您不想要的是创建一个新的Modifier对象,而是使用您已经拥有的相同修改器,即小写modifier.

private fun ComposeInfoCard(
     // modifier that you get here
    modifier: Modifier = Modifier) {

    Column (modifier = modifier   // same modifier is passed here with previous properties
        .background(backgroundColor)
        .fillMaxSize()
   )

注意:在迁移到像Jetpack Compose这样的复杂库之前,花更多的时间学习Kotlin类函数、命名参数、缺省值、变量范围、lambda函数等基础知识.在迁移到Android之前,也许可以try 在Kotlin中创建一些基本项目.

Android相关问答推荐

关于BLE扫描工作原理的说明

Jetpack Compose中的导航找不到NavHost类的名称为:startDestination";的参数

Android应用程序中的背景问题

无法加载类';com.android.build.api.extension.AndroidComponentsExtension';

(已解决)从最近的应用程序打开应用程序时出错

如何检测低性能 Android 设备进行条件动画渲染?

Android 应用程序从 Android Studio 安装,但不是作为 .apk 在外部安装.抛出java.lang.UnsatisfiedLinkError

在 AGP 8.0 中构建失败,无法应用插件realm-android. APIandroid.registerTransform已删除

java.lang.ExceptionInInitializerError -- 原因:java.lang.NullPointerException

系统导航栏在某些场景下应用了深色效果

Koin Android-KMM:我有嵌套范围但注入不起作用

Jetpack compose :使用 rememberSaveable 时未应用待处理的合成

在 Jetpack Compose 中使用 ViewModel 实现 startActivity 的最佳实践

在 Jetpack Compose 中重用具有重复代码的列

Jetpack Compose 中的滑动按钮菜单

Jetpack Compose Arc 进度条动画(如何重启动画)

如何在 Jetpack Compose 中禁用 TabRow 或 Tab 中的涟漪效应?

Google Play 控制台您的应用是否使用广告 ID?

如何使用jetpack compose实现布局,其中图标在列布局上是绝对位置

AndroidX Room 生成类错误:类是公共的,应在名为 class.java 的文件中声明