第1章 Compose简介:为什么说它是UI开发的未来

大家好,我是这门课的主讲。咱们直接开门见山——Jetpack Compose,说白了就是Google推出的原生声明式UI框架。你想想看,过去我们用XML写界面,用findViewById找控件,再用setText、setOnClickListener来回折腾,代码越写越碎,维护起来头皮发麻。Compose把这些全换了:用Kotlin代码直接写UI,数据变了界面自动更新,脑子里少装一坨状态同步逻辑。

我记得第一次在项目里引入Compose时,团队里还有人嘀咕:“又学新框架?会不会是坑?”结果两个月后,他主动把新模块全改成了Compose。原因很简单——效率翻倍,Bug减半。

1.1 到底什么是Jetpack Compose

Jetpack Compose是Android官方推出的声明式UI工具包。它和传统的View体系最大的区别在于:

  • 声明式 vs 命令式:你只管描述“界面长什么样”,不用管“怎么一步步画出来”。数据变了,框架自动帮你重建受影响的部分。
  • 纯Kotlin:没有XML,没有注解处理器,没有模板代码。一个@Composable函数就是一段UI。
  • 组件化:每个可组合函数都是独立组件,复用性极高。

核心概念一句话:Compose = UI = 函数调用。你调用一个Text(),它就在屏幕上渲染一段文字;你传给它不同的参数,它显示不同的内容。

1.2 Compose有什么优势?我来说几个真香的点

我个人在实际项目中体会最深的优势有这么几个:

  1. 代码量减少50%以上——没有findViewById,没有Adapter,没有ViewHolder。一个列表加个LazyColumn就搞定。
  2. 状态管理优雅——用remember和mutableStateOf,不用手动解绑、监听、防泄漏。我曾经在旧项目里因为忘记注销BroadcastReceiver导致内存泄漏查了两天,换Compose后这种问题几乎绝迹。
  3. 实时预览——IDE里边改边看,不用编译。虽然XML也有预览,但Compose预览可以直接交互,还能选不同主题、字体、屏幕尺寸。
  4. 动画天然支持——animateFloatAsState、AnimatedVisibility,三五行代码就能实现丝滑动画,比用ValueAnimator省太多事。
  5. 与现有View混用——项目可以逐步迁移,不用推倒重来。你可以在Activity或Fragment里嵌套ComposeView,也能在Compose中使用AndroidView包裹传统控件。

1.3 传统View与Compose的对比

咱们来看一张直观的对比表,这样你心里更有数:

方面传统View (XML + Kotlin/Java)Jetpack Compose
UI定义XML布局文件 + 代码逻辑纯Kotlin代码,@Composable函数
数据绑定findViewById / DataBinding / ViewBinding状态驱动:mutableStateOf + State
更新机制手动调用 findViewById().setText(...)自动重组(Recomposition)
列表组件RecyclerView + Adapter + ViewHolderLazyColumn / LazyRow,无需Adapter
动画ValueAnimator / ObjectAnimator / XML动画animate*AsState / AnimatedContent 等API
代码量较多(XML + Adapter + 逻辑)减少约40%~60%
学习曲线熟悉Android的开发者起点较低需要理解声明式思维和重组机制
预览Layout Editor,需编译@Preview注解,实时,可交互
兼容性API 1 起支持最低API 21,支持逐渐下沉

我个人建议:新项目直接上Compose;老项目可以按模块逐步迁移。不要一次全量替换,否则测试压力太大。我之前接手一个几十万行XML的项目,花了三个版本把几个核心页面改成Compose,后两个版本几乎没动过UI逻辑的Bug。

1.4 开发环境搭建——亲测无坑

嗯,这里要注意几个点,不然容易卡住。先列一下前提:

  • Android Studio:必须使用 Arctic Fox (2020.3.1) 或更高版本。我建议直接升级到最新稳定版,避免预览功能和编译器插件的兼容问题。
  • Kotlin:1.5.21 以上,推荐1.8+。Compose的Kotlin编译器扩展版本一定要和Kotlin版本匹配,否则编译报错。
  • compileSdk / minSdk:compileSdk 33+,minSdk 21(Compose最低支持API 21)。
  • Gradle版本:AGP 7.0+,推荐7.4+。

我曾经因为Kotlin版本和Compose编译器版本不匹配,卡编译卡了半小时,后来发现只要去官方兼容性表对一下就行。记住:composeOptions.kotlinCompilerExtensionVersion 必须和Kotlin版本一一对应。

搭建步骤非常简单,两步走:

  1. 创建新项目:Android Studio里选择“Empty Compose Activity”,模板会自动引入Compose相关依赖。我建议勾选“Use Kotlin DSL”和“Use compose compiler”。
  2. 手动添加依赖:如果升级已有项目,在模块的build.gradle.kts中添加:
android {
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.4" // 与Kotlin版本对应
    }
}

dependencies {
    val composeBom = platform("androidx.compose:compose-bom:2024.01.00")
    implementation(composeBom)
    implementation("androidx.compose.material3:material3")
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.ui:ui-tooling-preview")
    debugImplementation("androidx.compose.ui:ui-tooling")
}

配置完后,你就能在活动里写一个最简单的@Composable函数了:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text("Hello, Compose!") // 这就是UI
        }
    }
}

运行一下,看看是不是直接显示了文字?就这么简单。如果你遇到预览不显示,检查一下是不是开了@Preview(showBackground = true),以及IDE有没有同步Gradle。

测试环境建议:模拟器用API 33或34,真机至少Android 10以上,这样Compose的动画和Material3组件体验最完整。API 21~24也能跑,但部分高级特性(如阴影、模糊)会有回退效果。

1.5 本章知识体系一览

我画了一张图帮你梳理整章的知识结构。你大概看一眼,后面学起来思路会更清楚:

Compose 第1章知识体系图 Jetpack Compose 声明式UI框架 5大核心优势 View vs Compose 开发环境搭建 代码量减半 状态管理优雅 实时预览 动画原生支持 与View混用 声明式 vs 命令式 自动化 vs 手动更新 更少模板代码 核心思想:UI = f(state) 界面是状态的函数——状态变了,框架自动重组UI,你不需要写“更新”逻辑

这张图把本章四个核心模块串起来了:什么是Compose → 它的5大优势 → 和传统View的对比 → 环境搭建。后面每一章都会围绕类似的知识结构展开,你学起来会感觉非常体系化。

好了,第1章就到这里。你先把环境搭好,跑一个Hello World出来,心里就有底了。