1. Compose 初体验:什么是 Jetpack Compose?

说实话,我第一次接触 Compose 的时候,心里是有点抵触的。毕竟做 Android 开发这么多年,XML 布局已经写得滚瓜烂熟了。但当我真正用 Compose 写完一个页面后,我不得不承认——这玩意儿,真香。

Jetpack Compose 是 Google 推出的原生 UI 工具包。它完全抛弃了传统的 XML 布局方式,改用 Kotlin 代码直接描述界面。你可能会问:这不就是代码写 UI 吗?跟以前用 Java 写 View 有啥区别?

区别大了。Compose 的核心思想是声明式 UI。说白了,你只需要告诉框架「界面长什么样」,剩下的刷新、更新、重绘,框架自己搞定。

声明式 UI vs 命令式 UI

我拿一个简单的例子来说明。假设你有一个点赞按钮,点击后数字 +1。

命令式 UI(传统方式):

// 找到按钮
val button = findViewById<Button>(R.id.likeButton)
val textView = findViewById<TextView>(R.id.likeCount)

// 设置点击监听
button.setOnClickListener {
    count++
    // 手动更新 UI
    textView.text = "$count"
}

你看,每次数据变了,你得手动找到对应的 View,然后调用 setText、setVisibility 这些方法。页面复杂了,这种代码会变得非常混乱。我在项目中就见过一个 Activity 里塞了上千行 findViewById 和 setText,改个需求要翻半天。

声明式 UI(Compose 方式):

@Composable
fun LikeButton() {
    var count by remember { mutableStateOf(0) }
    
    Column {
        Text("点赞数:$count")
        Button(onClick = { count++ }) {
            Text("点赞")
        }
    }
}

看到区别了吗?你只需要描述「count 是多少,界面就长什么样」。count 变了,Compose 自动重新绘制相关部分。不需要你手动操作任何 View。

核心区别一句话总结:

命令式 UI:你告诉框架「怎么做」
声明式 UI:你告诉框架「要什么」

Compose 的优势

我个人觉得,Compose 最大的优势不是「少写代码」,而是逻辑和 UI 在一起。以前写一个列表,数据在 ViewModel 里,适配器在另一个文件,布局在 XML 里,点击事件又写在 Activity 里。改一个功能要打开四五个文件。

Compose 把这一切整合到了一起。你的 UI 逻辑、状态管理、事件处理,都可以写在一个 Composable 函数里。代码量直接砍半。

另外,Compose 的预览功能也很香。以前改个 XML 布局,得编译运行才能看到效果。Compose 支持实时预览,改完代码立刻看到界面变化。嗯,这里要注意,预览需要开启 @Preview 注解,但配置一次后面就很爽了。

对比项 传统 View 系统 Jetpack Compose
布局方式 XML + 代码 纯 Kotlin 代码
UI 更新 手动调用 setText 等 自动重组
状态管理 LiveData / 手动维护 mutableStateOf / StateFlow
代码量 较多 减少 40%-60%
学习曲线 平缓 初期有门槛

适用场景

Compose 适合新项目,也适合老项目逐步迁移。我建议新项目直接上 Compose,别犹豫。老项目可以从一个页面开始试水,比如设置页、个人中心这种相对独立的页面。

不过要注意,如果你的项目还在用低版本 API(比如 API 21 以下),Compose 的支持会受限。目前 Compose 最低支持 API 21,覆盖了 99% 的设备,基本不用担心。

避坑指南:

我曾经在一个老项目里强行全量迁移 Compose,结果发现有些第三方库还没适配,比如地图 SDK、视频播放器。折腾了两天又改回去了。建议先做调研,确认你用的关键库都支持 Compose。

环境搭建与第一个 Compose 项目

搭建环境其实很简单。你需要:

  • Android Studio Arctic Fox 或更高版本
  • Kotlin 1.5.31 以上
  • Gradle 7.0 以上

创建一个新项目时,直接选择「Empty Compose Activity」模板。Android Studio 会自动帮你配好所有依赖。

如果你要在现有项目里加 Compose,需要在 build.gradle 里添加:

// 在 android 块里
buildFeatures {
    compose = true
}

// 在 dependencies 里
implementation "androidx.compose.ui:ui:1.5.0"
implementation "androidx.compose.material3:material3:1.1.0"
implementation "androidx.compose.ui:ui-tooling-preview:1.5.0"
implementation "androidx.activity:activity-compose:1.7.0"

写第一个 Compose 页面,你只需要一个函数:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // 这就是你的第一个 Compose 页面
            Text("Hello, Compose!")
        }
    }
}

就这么简单。setContent 是 Compose 的入口,里面放你的 Composable 函数。Text 就是一个 Composable,相当于传统开发里的 TextView。

小技巧: 我个人习惯把 setContent 里的内容单独抽成一个函数,比如 App(),这样预览和测试都方便。别把所有代码都塞在 Activity 里,后面会很难维护。

知识体系总览

下面这张图帮你理清 Compose 的核心脉络:

Jetpack Compose 声明式 UI 描述界面状态 自动更新 UI @Composable 函数 可组合的 UI 单元 支持预览和复用 状态管理 mutableStateOf StateFlow / LiveData 布局组件 Column / Row / Box LazyColumn / LazyRow Material Design 3 主题 / 颜色 / 字体 深色模式适配 交互与动画 点击 / 手势 / 滚动 animateXxxAsState 核心:状态驱动 UI,数据决定界面

这张图把 Compose 的核心知识点串起来了。你从中心出发,沿着箭头走一遍,就能理解 Compose 的全貌。后面每一章,我们都会深入这些分支中的一个。

好了,第一章就到这里。环境搭好了,第一个页面也跑起来了。接下来你会接触到更多的 Composable 组件,慢慢就会发现——用 Compose 写 UI,真的会上瘾。


公众号:蓝海资料掘金营,微信deep3321