Jetpack Compose 核心特性与实战指南
Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发,打造生动而精彩的应用。它可让您更快速、更轻松地构建 Android 界面。
特点
- 更少的代码以及更快速的开发:声明式 UI 范式大幅减少了样板代码,UI 逻辑与业务逻辑更紧密。
- 直观:基于 Kotlin 的 API 设计符合开发者直觉,无需学习新的标记语言如 XML。
- 强大的兼容性:可与现有的 View 系统共存,支持渐进式迁移。
如何学习 Compose
一般学习一门框架都有一个过程,一个学习经历:
- 学会框架:动手写 Demo,理解框架应用场景,基本特点。
- 利用网络资源:搜寻多篇前人写过的拆轮子资源,下载源码,跟随资源进行源码跟踪。如果不动手,很难将框架理解的。
- 阅读源码时,学会总结:从一般使用方式入手,通过断点调试,观察源码执行顺序,忽略非重要代码,摸清源码主线实现思路后,再深入探索其中的细节实现。
- 回顾与整理:最后再过一遍思路,若走通了,那么框架的大概就理解了,同时整理笔记,便于日后忘了回来查看。
第一章 初识 Jetpack Compose
1. 为什么我们需要一个新的 UI 工具?
传统的 Android UI 开发主要基于 XML 布局文件和 View 树,存在响应式更新复杂、代码冗余等问题。Jetpack Compose 引入了声明式 UI 范式,让 UI 成为状态的函数,当状态改变时,UI 自动更新。
2. Jetpack Compose 的着重点
- 加速开发:实时预览功能允许开发者在不运行应用的情况下查看 UI 变化。
- 强大的 UI 工具:内置 Material Design 组件库,开箱即用。
- 直观的 Kotlin API:完全使用 Kotlin 语言编写,无需学习新的标记语言。
3. API 设计原则
- 一切都是函数:UI 由 Kotlin 函数定义。
- 顶层函数(Top-level function):Composable 函数通常作为顶层函数或成员函数存在。
- 组合优于继承:通过组合小部件构建复杂 UI,而非继承 View 类。
- 信任单一来源:状态应存储在单一可信源中。
4. 深入了解 Compose
- Core:核心基础库,提供底层构建能力。
- Foundation:提供基础构建块,如修饰符、动画等。
- Material:遵循 Material Design 规范的组件库。
5. 插槽 API
Compose 支持 Slot API,允许自定义内容区域,类似于 Android View 中的 ViewGroup 但更加灵活,支持高阶函数传递内容。
第二章 Jetpack Compose 构建 Android UI
1. Android Jetpack Compose 最全上手指南
环境准备和 Hello World
首先需要在 build.gradle 中添加依赖:
dependencies {
def composeBom = platform('androidx.compose:compose-bom:2023.10.01')
implementation(composeBom)
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material3:material3")
}
创建第一个 Composable 函数:
@Composable
fun Greeting(name: String) {
Text(text = "Hello $name!")
}
布局
Compose 提供了丰富的布局组件,如 Column、Row、Box 等。
Column(modifier = Modifier.padding(16.dp)) {
Text("Header")
Text("Content")
}
使用 Material design 设计
直接使用 MaterialTheme 即可应用主题样式,包括颜色、排版和形状。
2. 深入详解 Jetpack Compose | 优化 UI 构建
Compose 所解决的问题
解决了传统 View 系统中状态同步困难的问题,实现了 UI 与数据的双向绑定简化。
Composable 函数剖析
带有 @Composable 注解的函数可以被编译器识别为 UI 构建单元,支持嵌套调用。
声明式 UI
UI 是状态的函数:UI = f(State)。状态驱动视图渲染。
重组
当状态发生变化时,Compose 会自动重组受影响的 Composable 函数,而不是重新绘制整个视图树,提升性能。
3. 深入详解 Jetpack Compose | 实现原理
@Composable 注解意味着什么?
告诉编译器该函数可以参与组合逻辑,编译器会生成相应的字节码以支持组合管理。
执行模式
Compose 在后台维护一个 Composition 对象,负责追踪哪些部分需要更新,采用惰性求值策略。
Positional Memoization (位置记忆化)
优化重组性能,避免不必要的计算,仅当参数发生变化时才重新执行 Composable 函数体。
第三章 Jetpack Compose 实战演练
1. Jetpack Compose 应用 1:倒计时器
数据结构
使用 mutableStateOf 来管理时间状态,确保 UI 能感知变化。
var time by remember { mutableStateOf(60) }
倒计时功能
结合 LaunchedEffect 实现定时器逻辑,注意生命周期管理。
LaunchedEffect(key1 = true) {
while (time > 0) {
delay(1000)
time--
}
}
状态模式
确保 UI 反映最新的状态值,避免状态丢失或不同步。
2. Jetpack Compose 应用 2:玩安卓 App
准备工作
引入依赖,新建 Activity,配置 Theme。
创建 Compose
使用 setContent 设置根节点,初始化 ViewModel。
底部导航栏
使用 BottomNavigation 组件实现页面切换,配合 NavHost 管理路由。
管理状态
使用 ViewModel 配合 StateFlow 管理业务数据,实现跨组件通信。
3. 用 Compose Android 写一个天气应用
开篇
设计 UI 结构,确定数据模型。
画页面
使用 Column 和 Image 组件绘制背景和内容,处理图片加载。
画内容
动态加载天气数据并渲染,处理空状态和错误状态。
4. 进阶:列表与滚动
LazyColumn
对于长列表,推荐使用 LazyColumn 以优化内存占用,按需加载条目。
LazyColumn {
items(items) { item ->
Text(item.name)
}
}
滚动行为
使用 ScrollBehavior 控制顶部栏的滚动效果,提升交互体验。
5. 进阶:导航
Navigation Compose
使用 Navigation Compose 库管理应用内的导航流,支持深链接和参数传递。
总结
业务开发上,目前 Android 技术发展已经进入存量阶段,现在已经很难再出现一款框架或是技术,来颠覆我们项目的生产,Compose 的推出,无疑是给 Android 生态增添了一份生机。
对于要不要使用 Compose 这个问题,我的建议是:先尝试了解,学习官方文档,然后尝试写一些 Demo,对照着公司的项目,用 Compose 去仿写几个页面,如果整体问题不大的话,可以尝试对公司项目的二三级页面进行改造,然后通过性能监控或是用户反馈的方式,来收集一些意见。
不过话也说回来,Jetpack Compose 容器依然是一个 ViewGroup,没有脱离原生 View 体系,我觉得,问题应该不会太大,最多就是代码使用不当,重组作用域扩大,导致页面卡顿,但这种在开发期间是可以通过调试和监控可发现的,所以,大家赶紧用起来吧。
常见问题
Q: 如何在现有项目中引入 Compose?
A: 可以在现有 Activity 中使用 AndroidView 嵌入 View,或者新建 Compose Activity 逐步替换。
Q: 性能如何?
A: 在大多数场景下与 View 持平,但在复杂列表和频繁重组场景下需注意优化,如使用 derivedStateOf。
Q: 第三方库支持情况?
A: 主流库如 Retrofit、Glide 均已支持 Compose,可通过扩展函数适配。