使用Kotlin的ComponentActivity

mm9b1k5b  于 2023-08-07  发布在  Kotlin
关注(0)|答案(1)|浏览(265)

我在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完全不同,我不知道是否更好。

gk7wooem

gk7wooem1#

你问的大部分问题都与Jetpack Compose有关,这是一种构建在Kotlin之上的DSL(域特定语言)。这不是典型的Kotlin代码。
第一个要点:这适用于任何Kotlin代码。您可以使用该语法编写扩展函数。你没有扩展类。您正在编写一个可以像调用该类的成员一样调用的函数,但从行为上看,它实际上只是一个使用类类型作为参数的外部静态函数。
这个Kotlin特性的要点是它使实用函数非常容易编写和使用-代码看起来更自然。举例来说:

Arrays.sort(myIntArray); // java utility method call

字符串

myIntArray.sort() // kotlin extension function call


第二点:最后一个参数是函数引用的函数可以用圆括号外的lambda来调用。如果函数引用是 only 参数,则根本不需要括号。这就是所谓的“trailing lambda syntax”。此功能允许DSL style code to be written,并且在Jetpack Compose中广泛使用。此功能还可以更清晰地使用lambdas:

myButton.setOnClickListener( (button) -> {
    Log.i(TAG, "Button clicked");
    doSomething();
});


myButton.setOnClickListener {
    Log.i(TAG, "Button clicked")
    doSomething()
}


并且它启用范围函数:

myLayout.myButton.setTextColor(Color.RED);
myLayout.myButton.setUseElipsis(true);
myLayout.myButton.setText("Hello world");
myLayout.myButton.startBlinkAnimation();


myLayout.myButton.apply {
    textColor = Color.RED
    isUseElipsis = true
    text = "Hello world"
    startBlinkAnimation()
}


第三点:这又是一个尾随的lambda语法,但是在lambda之前有其他参数,所以它仍然有括号。
第四点:Compose有很多编译器“魔法”,所以不要太在意从它的方法返回的示例和你习惯的垃圾收集方式。Compose收集了从@Composable函数构建的所有内容,并且可能在后台保存了对这些内容的引用。编译器插件使用DSL来构建实际的UI。

相关问题