Jetpack Compose 是 Android 官方推出的现代化声明式 UI 工具包。它彻底颠覆了传统的基于 XML 和命令式 View 系统的开发模式,转而采用完全基于 Kotlin 的声明式 API。Compose 的核心思想是"UI 是状态的函数":当应用状态发生变化时,UI 会自动更新以反映最新状态。本文将从底层原理、常用 API 的实践,以及业界推荐的架构方案三个维度,为你深度剖析如何高效掌握和使用 Jetpack Compose。
一、 Compose 的底层原理

Compose 表面上是一个 UI 库,但其核心本质是一个 Kotlin 编译器插件 和一套智能的运行时(Runtime)系统。
1. 核心运行机制:声明式与重组 (Recomposition)
传统 UI(如 TextView)是命令式的,开发者需要手动调用 setText() 去修改它。而在 Compose 中,UI 组件是无状态的函数。
- 初次组合 (Initial Composition): 首次执行
@Composable函数,生成描述 UI 结构的节点树,并存储在底层的 Slot Table 结构中。 - 状态驱动重组 (Recomposition): 当组合函数所依赖的状态(State)发生改变时,Compose 的运行时系统会自动重新执行相关的
@Composable函数。它会计算出新旧状态的区别,并只更新真正发生变化的 UI 节点,这个过程被称为"重组"。
2. 渲染管线的三阶段
Compose 的渲染管线极其高效,严格按顺序执行以下三个步骤:
- 组合 (Composition): 决定"显示什么" (What)。系统执行 Composable 函数,生成 UI 元素树。
- 布局 (Layout): 决定"放在哪里" (Where)。测量节点大小并在二维屏幕上定位。Compose 强制规定单次测量 (Single Pass Measurement) ,彻底解决了传统 View 树嵌套导致的多次测算性能灾难。
- 绘制 (Drawing): 决定"如何渲染" (How)。将 UI 元素的像素实际绘制到 Canvas 屏幕上。
二、 常用 API 与使用方式

Compose 提供了一套直观且高度可组合的 API。以下是日常开发中最核心的几个类别:
1. 基础 UI 与布局组件
Compose 抛弃了复杂的 ConstraintLayout、LinearLayout 等,推荐使用简单的基础容器叠加来实现复杂布局。
| 组件分类 | 常用 API | 核心作用说明 |
|---|---|---|
| 基础控件 | Text |
显示文本内容,支持多样式混排 |
Button |
提供可点击的交互按钮 | |
Image |
渲染本地 Drawable 或位图 | |
| 布局容器 | Column |
垂直方向线性排列子元素,类似于垂直的 LinearLayout |
Row |
水平方向线性排列子元素,类似于水平的 LinearLayout | |
Box |
让子元素层叠排列,类似 FrameLayout,可用于背景覆盖 | |
| 列表组件 | LazyColumn |
高效渲染长列表,仅在可见区域渲染子元素,替代 RecyclerView |
2. 状态管理与 Modifier 修饰符
remember&mutableStateOf: 用于在组合中缓存和触发状态。mutableStateOf创建了一个可观察的值,一旦改变就会通知 Compose 进行重组;而remember则保证在重组过程中,该状态不会被重置。Modifier: Compose 中极其重要的概念。它是一个链式调用的 API,用于修饰 UI 元素的尺寸、背景、边距、点击事件等。注意:Modifier 的调用顺序对最终渲染结果有决定性影响(例如先加 padding 还是先加 background 结果完全不同)。
基础使用示例:
Kotlin
kotlin
@Composable
fun CounterScreen() {
// 使用 remember 缓存状态,使用 mutableStateOf 触发重组
var count by remember { mutableStateOf(0) }
// Column 作为垂直容器
Column(
modifier = Modifier
.fillMaxSize() // 充满父布局
.padding(16.dp), // 外边距
horizontalAlignment = Alignment.CenterHorizontally // 水平居中
) {
Text(text = "当前点击次数: $count", fontSize = 24.sp)
Button(
onClick = { count++ },
modifier = Modifier.padding(top = 16.dp)
) {
Text("点击 +1")
}
}
}
三、 推荐的开发框架与架构
在 Compose 环境下,由于 UI 本身是由状态驱动的,传统的 MVP 甚至经典的 MVC 模式不再适用。目前业界的主流标准是 单向数据流 (UDF, Unidirectional Data Flow) ,通常结合 MVVM 或 MVI (Model-View-Intent) 架构。

推荐的架构栈组合:MVVM + UDF + StateFlow
-
UI 状态 (UiState): 将界面的所有状态封装成一个不可变的 Kotlin
data class。 -
ViewModel 层: 负责处理业务逻辑和网络请求,并将
UiState通过StateFlow或LiveData暴露给 Compose 观察。 -
单向流动模型:
- 状态向下 (State flows down): ViewModel 将最新的状态推送到 Compose 页面。
- 事件向上 (Events flow up): 用户在 Compose 中发生的交互(如点击),不直接修改状态,而是将意图 (Intent/Event) 回传给 ViewModel,由 ViewModel 统一处理并产出新状态。
推荐的生态工具链
- 依赖注入:
Hilt。结合hilt-navigation-compose库,可以极其优雅地在 Composable 中注入 ViewModel。 - 导航路由:
Navigation Compose(官方推荐,适合单 Activity 架构)。 - 图片加载:
Coil。完全基于 Kotlin 协程编写,原生提供AsyncImageAPI,是目前 Compose 生态中最主流的图片框架。
总结
Jetpack Compose 不仅仅是一个全新的 UI 库,更是 Android 开发思维的重大转变。
- 在原理层面, 它利用 Kotlin 编译器实现了基于状态的自动重组,并通过明确的"组合-布局-绘制"三阶段重构了渲染管线,解决了传统视图层级过深的性能痛点。
- 在 API 层面, 通过极简的函数式 API(如 Column、Text、Modifier 等),开发者可以用更少、更直观的代码构建极其复杂的界面。
- 在架构层面, 拥抱单向数据流(基于 ViewModel 与 StateFlow),将状态管理与 UI 渲染彻底解耦,是构建健壮现代 Android 应用的最佳实践。
掌握 Compose 的关键在于打破"直接操作视图"的命令式编程旧习惯。一旦你习惯了"让 UI 只做状态的镜像"这种思维,Android 界面开发将变得前所未有的高效与可靠。
