1.3 温习Kotlin
Compose是基于Kotlin构建的,所以学习Compose之前需要温习Kotlin的一些知识。
1.3.1 默认参数
在编写Kotlin的时候,可以在类的构造方法或者普通方法中使用默认参数,以此减少大量重载方法。举个例子:
class DefaultParam { companion object { private const val TAG = "DefaultParam" } fun test() { test1(0) Test(b = "") } fun test1(a: Int, b: String = "") { Log.e(TAG, "test1: a:$a b:$b") } } data class Test(val a: Int = 0, val b: String)
上面的代码构建了一个Test类,构造方法中接收两个参数,第一个有默认值,第二个没有,所以调用的时候就可以不写第一个参数。DefaultParam类中还有一个test1的方法,也接收两个参数,不同的是,第一个参数没有默认值,也就是必须设置,而第二个参数有默认值。
这两种调用的区别在于:如果第一个参数没有默认值,可以省略命名参数,反之则不能省略命名参数。如果一次性将所有参数都传入而不使用参数默认值,也可省略命名参数。使用命名参数可以使代码更具描述性。
默认参数在Compose中使用得非常广泛,基本每一个控件都会用到,因此大家需要掌握Kotlin的默认参数。
1.3.2 高阶函数
自从开始学习Kotlin,就一直听到“高阶函数”这个词,其实它并不难,能接收其他函数作为参数的函数就是高阶函数。一个简单的高阶函数如下所示:
class HigherFunctions { companion object { private const val TAG = "HigherFunctions" } fun test() { high({ Log.e(TAG, "test: string: $it") }, "test") } fun high(one: (String) -> Unit, string: String) { // 或者使用one.invoke进行调用 one(string) } }
上面示例代码中的high就是一个高阶函数,因为它接收其他函数作为参数。使用高阶函数时,既可以直接传入lambda表达式,也可以传入方法。
在Compose中很多地方用到了尾随lambda表达式。尾随lambda表达式是Kotlin提供的一种特殊语法,在调用最后一个参数为lambda的高阶函数时,可以将lambda表达式放在圆括号后面,而不是将其放在圆括号内。来看一个例子:
fun test2() { high2 { Log.e(TAG, "test: string: $it") } } fun high2(two: () -> Unit) { two() }
上面代码中的high2是一个高阶函数,因为它只有一个参数,其参数类型还是一个函数,所以可以使用尾随lambda来进行调用,省略了圆括号。
1.3.3 解构数据类
数据类在Kotlin中很常见,前面的例子中也用到了数据类。当我们定义了数据类,想使用它来访问数据的时候,就可以使用解构声明了。比如想要访问前面定义的Test数据类中的参数,可以这么写:
fun testData(){ val test = Test(a = 10, b = "Zhujiang") val (a, b) = test Log.e(TAG, "testData: a=$a") Log.e(TAG, "testData: b=$b") }
解构声明使用起来非常方便,大家以后在Compose的编写过程中如需使用数据类,就可以使用解构声明来获取数据。