Xue*_*ang 5 kotlin android-jetpack-compose
Kotlin 初学者:我正在查看 Jetpack Compose 教程,并且遇到了以下代码片段:
@Composable
fun MessageCard(msg: Message) {
Column {
Text(text = msg.author)
Text(text = msg.body)
}
}
Run Code Online (Sandbox Code Playgroud)
如果Column是一个函数名,没有“()”但有{}怎么调用呢?我希望它像 Text 函数一样被调用。
我尝试将 Column 视为对象或代码块名称,但这都没有意义。
Column是一个接受单个参数的函数,该参数是一个 lambda 函数,其中某个对象(Receiver例如调用它)作为接收者。
Column将在代码中的某个位置定义如下:
fun Column(exec: Receiver.() -> Unit) {
// Code to run the Column function
// This will create or otherwise obtain an object of type Receiver
// and execute `exec` in its scope
}
Run Code Online (Sandbox Code Playgroud)
我建议使用您的 IDE 查找其定义,以便您可以进一步了解发生了什么。
在 Kotlin 中,lambda 是在大括号内定义的。Kotlin 允许使用简写表示法,当最后一个参数是 lambda 函数时,可以省略用于调用函数的普通括号,并且您的示例中正在使用该表示法。同样你可以写:
Column({
Text(text = msg.author)
Text(text = msg.body)
})
Run Code Online (Sandbox Code Playgroud)
但为了清晰起见并符合约定,您的 IDE 可能会建议您删除外括号。
Receiver是一种公开函数的类型Text,允许您Text在传递给 的 lambda 函数内进行调用Column。因此Receiver将被定义为:
class Receiver {
fun Text(text: String) {
// Do something with the text, probably saving it within Receiver
// for later processing when `Column` is called
}
}
Run Code Online (Sandbox Code Playgroud)
Dol*_*boy -3
这里 Column {} 是您调用的函数,但您可以将其视为一个容器。您可以将要放置在列中的元素放入其中。如果需要,您可以将其视为 HTML 中的容器。你可以这样做:
@Composable
fun ArtistCard() {
Column {
Text("Alfred Sisley")
Text("3 minutes ago")
Row {
Text("Alfred Sisley")
Text("3 minutes ago")
}
}
}
Run Code Online (Sandbox Code Playgroud)
它会显示类似以下内容:
阿尔弗莱德·西斯莱
3 分钟前
阿尔弗雷德·西斯莱 3 分钟前
您可以在此处阅读该文档
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |