Dav*_*rez 2 android kotlin android-jetpack-compose
我有生以来第一次学习编程。我花了大约 2 周的时间通过免费课程学习 Kotlin,并专门花了一周的时间在 Android Studio 中学习 Jetpack Compose。我已经被一道练习题困住了两天,但我在互联网上遇到的每个答案都假设我知道的比我知道的还要多。这种做法包括制作一个像CorrectQuadrant这样的象限,但除非我做出对我来说没有意义的更改,否则我只能像这样In CorrectQuadrant那样得到它。
所以问题是我不太理解修饰符参数,所以尝试又尝试我终于下载了解决方案代码并发现了错误,但我无法理解为什么这是一个错误。在下面的代码中,在私有函数“ComposeInfoCard”中,您可以看到修饰符 Column 参数被 (=====) 包围。如果我用小写字母写该参数(修饰符=修饰符),我会得到正确的象限。如果我像这样写(modifier = Modifier),这就是我认为它是正确的,私有函数中的修饰符参数说“参数修饰符从未使用过”,但这不是真的,因为我使用了它四次用于 ComposeQuadrant 函数中的权重修改器。
有人可以解释为什么它需要小写,并且如果您不介意的话,请解释一下对象修饰符,就像我对此完全陌生一样?
@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
)
}
}
Run Code Online (Sandbox Code Playgroud)
简短说明:modifier
small-case 是创建时ComposeQuadrant
属性权重为 1f 的现有修饰符。当您使用Modifier
大写字母时,您会创建一个新的修饰符对象,因此它不具有以前的权重属性。
长解释:
参数- 这些是您在调用函数时提供的输入,然后函数可以使用输入变量。但是我们需要定义这些变量的数据类型参数,即它是 String 还是 Int 等。
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
}
Run Code Online (Sandbox Code Playgroud)
现在我们调用该函数
greetMe("Hi", "Pawan")
Run Code Online (Sandbox Code Playgroud)
输出是
Hi to Pawan
Run Code Online (Sandbox Code Playgroud)
现在,假设以greetMe
这种方式调用相同的函数
greetMe("Pawan", "Hi")
Run Code Online (Sandbox Code Playgroud)
输出是
Pawan to Hi
Run Code Online (Sandbox Code Playgroud)
代码实现有什么问题吗?不!因为“Pawan”和“Hi”都是字符串,而这正是该函数所需要的。但这在逻辑上正确吗?不!因为我们以错误的顺序提供了输入。为了处理这个问题,我们使用命名参数,并以这种方式调用函数
greetMe(name = "Pawan", greeting = "Hi")
Run Code Online (Sandbox Code Playgroud)
虽然我们提供的输入序列是错误的,但输出是正确的,因为我们使用了命名参数,所以现在它们将被映射到正确的变量。
Hi to Pawan
Run Code Online (Sandbox Code Playgroud)
现在来提问...
ComposeInfoCard(modifier = Modifier.weight(1f))
Run Code Online (Sandbox Code Playgroud)
在这里您正在调用ComposeInfoCard
并使用命名参数。您创建一个新的 Modifier 对象,更改其属性,即将权重设置为 1f。
private fun ComposeInfoCard(modifier: Modifier = Modifier) {
}
Run Code Online (Sandbox Code Playgroud)
好的,我希望现在您了解第一个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()
)
Run Code Online (Sandbox Code Playgroud)
现在在这里你调用另一个函数,它Column
也需要一个修饰符,你创建了一个新Modifier
对象并更改了背景颜色。您不想要的是创建一个新对象,而是使用您已有的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()
)
Run Code Online (Sandbox Code Playgroud)
注意:在转向像 Jetpack Compose 这样的复杂库之前,请花更多时间了解 Kotlin 的基础知识,例如函数、命名参数、默认值、变量范围、lambda 函数等。也许在迁移到 Android 之前尝试在 Kotlin 中创建一些基本项目。
归档时间: |
|
查看次数: |
294 次 |
最近记录: |