1. Jetpack Compose 基础入门
Jetpack Compose 彻底改变了 Android 开发者的 UI 构建方式。作为一名从传统 View 系统转型过来的开发者,我至今记得第一次用 Compose 完成复杂界面时的震撼——原本需要数百行 XML 和 Java 代码的界面,现在用 Kotlin 几十行就搞定了。
Compose 的核心思想很简单:用声明式的 Kotlin 代码描述 UI 应该是什么样子,而不是一步步指挥系统如何构建 UI。这种范式转变带来了三个显著优势:
- 代码量减少约 50%(Google 官方数据)
- 实时预览功能让开发效率提升 2-3 倍
- 组合优于继承的设计避免了传统 View 系统的层级爆炸问题
1.1 开发环境配置
开始前需要确保环境正确配置。我推荐使用最新稳定版 Android Studio(当前为 Hedgehog),它内置了完整的 Compose 工具链支持:
bash复制// 在模块级 build.gradle.kts 中配置
android {
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.3" // 与Kotlin版本匹配
}
}
dependencies {
implementation("androidx.compose.ui:ui:1.5.4")
implementation("androidx.compose.material3:material3:1.1.2")
// 其他依赖...
}
注意:Compose 编译器版本必须与 Kotlin 版本严格匹配。我遇到过因版本不匹配导致的诡异编译错误,建议通过 官方兼容性地图 核对。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 可组合函数深度解析
2.1 函数式 UI 构建
Compose 的核心是可组合函数(Composable Functions),它们有四个关键特征:
- 注解驱动:必须添加
@Composable注解 - 无返回值:不返回任何值(相当于返回 Unit)
- 幂等性:相同输入永远产生相同输出
- 无副作用:不应修改外部状态
kotlin复制@Composable
fun Greeting(name: String) {
Text(
text = "Hello, $name!",
modifier = Modifier.padding(16.dp),
style = MaterialTheme.typography.headlineMedium
)
}
这个简单例子展示了典型模式:
- 接受参数(name)
- 调用其他可组合函数(Text)
- 使用 Modifier 配置外观
- 应用主题样式
2.2 状态管理基础
状态是 Compose 中最容易出错的部分。来看一个计数器实现:
kotlin复制@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(
onClick = { count++ },
modifier = Modifier.padding(16.dp)
) {
Text("Clicked $count times")
}
}
关键点:
remember保证重组时状态不丢失mutableStateOf创建可观察状态- 状态变化自动触发重组
常见坑:直接在 onClick 中修改非状态变量不会触发 UI 更新。我曾在初期因此浪费数小时调试。
3. 核心布局系统
3.1 基础布局组件
Compose 提供三大基础布局:
| 组件 | 方向 | 适用场景 | 对应传统布局 |
|---|---|---|---|
| Column | 垂直 | 表单、列表项 | LinearLayout(VERTICAL) |
| Row | 水平 | 工具栏、标签栏 | LinearLayout(HORIZONTAL) |
| Box | 叠加 | 浮动按钮、带装饰的文本 | FrameLayout |
实际项目示例:
kotlin复制@Composable
fun ProfileCard(user: User) {
Row(
modifier = Modifier
.padding(16.dp)
.fillMaxWidth()
) {
Image(
painter = rememberImagePainter(user.avatarUrl),
contentDescription = null,
modifier = Modifier.size(48.dp)
)
Column(Modifier.padding(start = 8.dp)) {
Text(user.name, style = MaterialTheme.typography.titleMedium)
Text(user.bio, style = MaterialTheme.typography.bodySmall)
}
}
}
3.2 高级布局技巧
权重布局:类似 LinearLayout 的 weight 属性
kotlin复制Row {
Text(
"Left",
Modifier.weight(1f),
textAlign = TextAlign.Start
)
Text(
"Right",
Modifier.weight(1f),
textAlign = TextAlign.End
)
}
自定义布局:需要测量和定位子项时
kotlin复制@Composable
fun CustomLayout(
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
Layout(
content = content,
modifier = modifier
) { measurables, constraints ->
// 测量逻辑...
// 定位逻辑...
layout(width, height) {
// 放置子项...
}
}
}
4. 主题与样式系统
4.1 Material Design 3 集成
Compose 深度集成 Material 3:
kotlin复制// 定义主题
private val MyAppColorScheme = darkColorScheme(
primary = Purple80,
secondary = PurpleGrey80,
// 其他颜色...
)
@Composable
fun MyAppTheme(content: @Composable () -> Unit) {
MaterialTheme(
colorScheme = MyAppColorScheme,
typography = MyTypography,
content = content
)
}
使用技巧:
- 通过
MaterialTheme.colorScheme访问颜色 - 使用
MaterialTheme.typography获取文字样式 - 深色模式自动适配(需要配置系统)
4.2 样式复用模式
避免硬编码样式参数:
kotlin复制// 错误做法:样式硬编码
Text("Hello", color = Color.Red)
// 正确做法:使用主题
Text("Hello", style = MaterialTheme.typography.titleLarge)
// 进阶:创建可复用样式
@Composable
fun HeadingText(text: String) {
Text(
text = text,
style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(bottom = 8.dp)
)
}
5. 交互与动画
5.1 点击交互实现
kotlin复制@Composable
fun InteractiveButton() {
var clicked by remember { mutableStateOf(false) }
Box(
modifier = Modifier
.size(100.dp)
.background(if (clicked) Color.Green else Color.Red)
.clickable { clicked = !clicked }
)
}
5.2 基础动画效果
kotlin复制@Composable
fun AnimatedBox() {
var expanded by remember { mutableStateOf(false) }
val height by animateDpAsState(
targetValue = if (expanded) 200.dp else 100.dp,
animationSpec = spring(dampingRatio = 0.3f)
)
Box(
modifier = Modifier
.height(height)
.fillMaxWidth()
.background(MaterialTheme.colorScheme.primary)
.clickable { expanded = !expanded }
)
}
6. 调试与优化
6.1 重组调试技巧
使用 debugInspectorInfo 检查不必要的重组:
kotlin复制@Composable
fun DebuggableComponent() {
var counter by remember { mutableStateOf(0) }
Text(
"Count: $counter",
modifier = Modifier
.padding(16.dp)
.debugInspectorInfo {
name = "counterText"
properties["counter"] = counter
}
)
Button(onClick = { counter++ }) {
Text("Increment")
}
}
6.2 性能优化策略
- 稳定参数:确保传递给可组合函数的参数是稳定的(使用
@Stable注解) - 延迟加载:对长列表使用
LazyColumn/LazyRow - 派生状态:使用
derivedStateOf减少不必要的重组 - 记忆昂贵计算:使用
remember缓存计算结果
kotlin复制@Composable
fun OptimizedList(items: List<Item>) {
LazyColumn {
items(items) { item ->
ItemRow(item = item)
}
}
}
7. 与传统 View 系统互操作
7.1 在 Activity 中使用
kotlin复制class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
Surface {
Greeting("Android")
}
}
}
}
}
7.2 混合使用技巧
在 Compose 中嵌入传统 View:
kotlin复制@Composable
fun WebViewContainer(url: String) {
AndroidView(
factory = { context ->
WebView(context).apply {
loadUrl(url)
}
},
modifier = Modifier.fillMaxSize()
)
}
在传统 View 中使用 Compose:
kotlin复制val composeView = ComposeView(context).apply {
setContent {
MaterialTheme {
Text("Hello from Compose!")
}
}
}
掌握这些基础后,你已经可以构建大多数常见界面。Compose 的学习曲线前期较陡,但一旦适应这种声明式思维,开发效率会有质的飞跃。建议从重构简单页面开始,逐步过渡到复杂场景。
