我在Kotlin中生成的MainActivity让我很困惑:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
// A surface container using the 'background' color from the theme
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
Greeting("Android")
}
}
}
}
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
fun GreetingPreview() {
MyAppTheme {
Greeting("Android")
}
}
}
字符串
- setContent被声明为public fun ComponentActivity.setContent(parent:CompositionContext?= null,内容:@Composable()-> Unit),但似乎与ComponentActivity类没有关系。如果你只是在新方法前面写classname + dot,你能在一个额外的文件中扩展Kotlin中的类吗?
- MyAppTheme是Theme.kt文件中的一个函数,但与类没有关系,也没有返回类型。写它后面跟着一个带花括号的块是什么意思?
- 然后我们有一个Surface的方法调用,后面还跟着一个大括号块
- Greeting创建了一个不返回的Text示例,因此它必须被丢失并进行垃圾收集。
我一定是错过了W3schools kotlin tutorial中的所有内容。我还没有找到一个ComponentActivity与Kotlin教程谷歌搜索。也许有人能告诉我那些神秘的构造?这与Java完全不同,我不知道是否更好。
1条答案
按热度按时间gk7wooem1#
你问的大部分问题都与Jetpack Compose有关,这是一种构建在Kotlin之上的DSL(域特定语言)。这不是典型的Kotlin代码。
第一个要点:这适用于任何Kotlin代码。您可以使用该语法编写扩展函数。你没有扩展类。您正在编写一个可以像调用该类的成员一样调用的函数,但从行为上看,它实际上只是一个使用类类型作为参数的外部静态函数。
这个Kotlin特性的要点是它使实用函数非常容易编写和使用-代码看起来更自然。举例来说:
字符串
对
型
第二点:最后一个参数是函数引用的函数可以用圆括号外的lambda来调用。如果函数引用是 only 参数,则根本不需要括号。这就是所谓的“trailing lambda syntax”。此功能允许DSL style code to be written,并且在Jetpack Compose中广泛使用。此功能还可以更清晰地使用lambdas:
型
对
型
并且它启用范围函数:
型
对
型
第三点:这又是一个尾随的lambda语法,但是在lambda之前有其他参数,所以它仍然有括号。
第四点:Compose有很多编译器“魔法”,所以不要太在意从它的方法返回的示例和你习惯的垃圾收集方式。Compose收集了从
@Composable
函数构建的所有内容,并且可能在后台保存了对这些内容的引用。编译器插件使用DSL来构建实际的UI。