跳转到正文
YGJoon
返回

Android Kotlin Jetpack Compose 实战指南

编辑文章

基本组件与函数签名

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(text = "Hello $name!", modifier = modifier.padding(16.dp))
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    Greeting("Android")
}

状态管理

remember 与 mutableStateOf

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ }) {
        Text("点击次数:$count")
    }
}

rememberSaveable

var text by rememberSaveable { mutableStateOf("") }

StateFlow + collectAsStateWithLifecycle

@Composable
fun HomeScreen(viewModel: HomeViewModel = hiltViewModel()) {
    val state by viewModel.uiState.collectAsStateWithLifecycle()
    when (state) {
        is UiState.Loading -> Loading()
        is UiState.Success -> ArticleList(state.data)
        is UiState.Error -> ErrorView(state.error)
    }
}

布局与 Modifier

val listModifier = Modifier
    .fillMaxSize()
    .background(MaterialTheme.colorScheme.background)

LazyColumn(modifier = listModifier) {
    items(articles) { article -> ArticleItem(article) }
}

副作用处理

API用途
LaunchedEffect启动协程执行一次性任务
DisposableEffect注册/注销监听
rememberUpdatedState捕捉最新 lambda,避免闭包问题
SideEffect在每次成功重组后与外部世界同步
@Composable
fun AutoRefresh(onRefresh: () -> Unit) {
    val latestOnRefresh by rememberUpdatedState(onRefresh)
    LaunchedEffect(Unit) {
        while (true) {
            delay(5_000)
            latestOnRefresh()
        }
    }
}

动画

val alpha by animateFloatAsState(
    targetValue = if (visible) 1f else 0f,
    animationSpec = tween(durationMillis = 300)
)

AnimatedVisibility(visible = expanded) {
    Text("详情内容")
}

Compose + Navigation

@Composable
fun AppNavGraph(navController: NavHostController = rememberNavController()) {
    NavHost(navController, startDestination = "home") {
        composable("home") { HomeScreen(onNavigate = { navController.navigate("detail/$it") }) }
        composable(
            route = "detail/{id}",
            arguments = listOf(navArgument("id") { type = NavType.LongType })
        ) { backStackEntry ->
            val id = backStackEntry.arguments?.getLong("id") ?: return@composable
            DetailScreen(id)
        }
    }
}

性能优化

LazyColumn {
    items(items = messages, key = { it.id }) { message ->
        MessageItem(message)
    }
}

测试策略

@RunWith(AndroidJUnit4::class)
class HomeScreenTest {
    @get:Rule
    val composeRule = createAndroidComposeRule<MainActivity>()

    @Test
    fun showLoading() {
        composeRule.onNodeWithText("加载中").assertExists()
    }
}

常见问题

问题原因解决方案
重组频繁状态对象不稳定使用 remember、derivedStateOf
滚动跳动LazyList item 未提供稳定 key在 items 中提供唯一 key
状态丢失使用 remember 而非 rememberSaveable对需持久状态使用 rememberSaveable

总结

  1. Jetpack Compose 通过函数式 UI 与 Kotlin 状态管理提升开发效率。
  2. 熟练掌握 remember、Flow、SideEffect 等 API,可构建响应式界面。
  3. 关注性能与测试,才能在大型项目中稳定落地 Compose。

下一篇将探讨 Kotlin 在架构组件与多模块协同中的实践。


编辑文章
分享这篇文章:

上一篇
Android Kotlin Multiplatform 入门
下一篇
Android Kotlin Hilt 依赖注入实战