本文是参与七日打卡活动的快速入门级文章。因为时间紧任务重,很难进行细致的选题和知识体系的搭建,所以选择了特别新(还是alpha发布)的技术点,可以大家一起快速学习,提前熟悉 Android 未来的发展方向。
一、Compose 是什么
Compose 是一种全新的 UI 开发方式,用于取代 xml 搭建 View 层级的方式。先来看一个 Hello World 的代码对比:
有没有产生什么想法呢?我的第一想法是 Compose 的实现更接近 Swift UI 或者 Flutter,xml 的实现更接近 html,或许可以看出一些趋势了吧。这里提出两个问题让大家思考一下。
- 问题1:xml 是唯一的布局搭建方式吗?
- 问题2:工作中有觉得 xml 不够用的情况出现吗?
过去,Android 开发中主要使用 xml 搭建布局,只是偶尔会在代码中动态修改,究其原因,主要是 xml 搭建布局层次结构清晰并且可以预览。xml 的方式也并非完美,当布局需要根据数据动态调整的时候,固定的 xml 文件本身就很成为阻碍,开发者一般会通过提前隐藏一部分 View 或者提供多个 xml 文件按需选择的方式解决。
xml 搭建 View 不是唯一的方案,早在七八年前就有人尝试不使用 xml 而是直接在 Java 中创建 View 对象,但是在 Java/Kotlin 代码中添加 View 需要先后创建 View 和 LayoutParams 对象再进行一长串的设置,整个过程又不能预览,实在难以阅读和维护。
随着 MVVM 模式的普及,xml + Activity/Fragment 构成 View 层的割裂感逐渐浮出水面。Activity/Fragment 才是 View 层,xml 只是 View 层里描述布局方式的静态文件,本质上是一种辅助工具。
Compose 是一种相似的工具,可以在 Activity/Fragment 中用层次清晰、代码简洁的方式搭建布局,并且 「可以预览」。
二、Compose 编程思想
在正式学习使用 Compose 之前,我们还需要一些预备知识,主要是以下几点:
- Kotlin 语法
- 函数式编程思想
回到上一节的例子,我们使用了一个 Text 组件声明了一段文本 View,从代码格式上看,可以说是一种声明式的写法,这一点跟 Swift UI 高度一致,确实可以当做是一种新的语法去入门。但实际上整个 Activity 还是 .kt 的文件,还是要作为 Kotlin 源码参与编译,这段声明本质上也还是 Kotlin 代码,Text 就是一个不符合常规函数命名的函数:
这里提到函数式编程主要是因为 Compose 组件函数原则上需要具备一种函数式特性:无副作用。
在计算机科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量),修改参数或改变外部存储。(摘自维基百科)
Compose 组件被定义在代码中了,表面上看起来与其他函数并无区别,而 Compose 组件函数用于描述 View,每次 View 重绘都需要自顶向下调用一遍 Compose 组件函数,如果副作用是修改数据或者获取了函数参数之外的数据,在 Compose 组件函数中产生的结果是难以预测的;如果副作用消耗时间较长,就会直接导致 App 页面卡顿。
三、Compose 复杂页面效果展示
此处使用官方 Demo,熟悉一下 Compose 搭建复杂页面的时候代码看起来是什么样子。
PS:下班才能开始写,准备文章加上运行项目和做图片,一不小心就十一点了。这一系列文章意在抛砖引玉共同学习,可能有不准确甚至不正确的地方,任何问题欢迎一起讨论。