Jetpack Compose:Android全新UI编程
上QQ阅读APP看书,第一时间看更新

Compose是基于Kotlin构建的,所以学习Compose之前需要温习Kotlin的一些知识。

在编写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的默认参数。

自从开始学习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来进行调用,省略了圆括号。

数据类在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的编写过程中如需使用数据类,就可以使用解构声明来获取数据。