Xue*_*ang 5 kotlin android-jetpack-compose
Kotlin 初学者:我正在查看 Jetpack Compose 教程,并且遇到了以下代码片段:
@Composable
fun MessageCard(msg: Message) {
    Column {
        Text(text = msg.author)
        Text(text = msg.body)
    }
}
如果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
}
我建议使用您的 IDE 查找其定义,以便您可以进一步了解发生了什么。
在 Kotlin 中,lambda 是在大括号内定义的。Kotlin 允许使用简写表示法,当最后一个参数是 lambda 函数时,可以省略用于调用函数的普通括号,并且您的示例中正在使用该表示法。同样你可以写:
Column({
   Text(text = msg.author)
   Text(text = msg.body)
})
但为了清晰起见并符合约定,您的 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
   }
}
Dol*_*boy -3
这里 Column {} 是您调用的函数,但您可以将其视为一个容器。您可以将要放置在列中的元素放入其中。如果需要,您可以将其视为 HTML 中的容器。你可以这样做:
@Composable
fun ArtistCard() {
    Column {
        Text("Alfred Sisley")
        Text("3 minutes ago")
        Row {
            Text("Alfred Sisley")
            Text("3 minutes ago")
        }
    }
}
它会显示类似以下内容:
阿尔弗莱德·西斯莱
3 分钟前
阿尔弗雷德·西斯莱 3 分钟前
您可以在此处阅读该文档
| 归档时间: | 
 | 
| 查看次数: | 237 次 | 
| 最近记录: |