速查

按 API / XML / 易错点筛选;链回正文锚点。

术语详解见术语表;全貌见组件总表属性总表

没有匹配的条目。

remember / mutableStateOf

干什么

跨重组保存可观察状态

怎么写

var x by remember { mutableStateOf(0) }

XML 对照

字段 + setXxx

易错点

忘记 remember 导致重置

rememberSaveable

干什么

旋转后仍保留简单状态

怎么写

var s by rememberSaveable { mutableStateOf("") }

XML 对照

onSaveInstanceState

易错点

复杂对象需 Saver

viewModel()

干什么

获取与生命周期绑定的 VM

怎么写

val vm: X = viewModel()

XML 对照

AAC ViewModel

易错点

不要自己 new ViewModel()

collectAsStateWithLifecycle

干什么

生命周期安全收集 Flow

怎么写

val ui by flow.collectAsStateWithLifecycle()

XML 对照

observe LiveData

易错点

在 Composable 内调用

LaunchedEffect

干什么

进入组合启动协程,离开或 key 变则取消。收集一次性事件、滚动、聚焦。

怎么写

LaunchedEffect(vm) { vm.events.collect { … } }

XML 对照

这段 UI 在树上时跑(≠ 单纯 onResume)

易错点

key 不稳会循环;业务拉数放 ViewModel.init

rememberCoroutineScope

干什么

回调里启动协程,离开组合取消。

怎么写

val scope = rememberCoroutineScope(); onClick = { scope.launch { … } }

XML 对照

setOnClickListener + lifecycleScope

易错点

不是进页即跑;体里直接 launch 仍会乱飞

DisposableEffect

干什么

成对注册 / 反注册。

怎么写

DisposableEffect(key) { …; onDispose { } }

XML 对照

onStart 注册、onStop 反注册

易错点

忘记 onDispose;key 不稳会狂注册

BackHandler

干什么

接管系统返回,离开组合自动卸。

怎么写

BackHandler(enabled = dirty) { ask = true }

XML 对照

OnBackPressedCallback

易错点

对话框打开时下层仍 enabled

LifecycleResumeEffect

干什么

对齐前台 / 后台,回前台再刷、埋点。

怎么写

LifecycleResumeEffect(Unit) { …; onPauseOrDispose { } }

XML 对照

onResume / onPause

易错点

组合一直在树上时 LaunchedEffect(Unit) 不重跑

SideEffect

干什么

组合成功后同步写非 Compose 对象。

怎么写

SideEffect { analytics.setUserId(id) }

XML 对照

布局完成后再同步外部状态

易错点

不要发网络;挂起工作用 LaunchedEffect

NavHost / navigate

干什么

多页面路由与返回栈

怎么写

nav.navigate("detail/$id")

XML 对照

nav_graph.xml + NavHostFragment

易错点

底栏忘记 popUpTo;不要一页一个 Activity

popUpTo / launchSingleTop

干什么

切 Tab 不叠栈、登录后洗掉登录页。

怎么写

navigate("home") { popUpTo(start) { saveState = true }; launchSingleTop = true }

XML 对照

singleTop / CLEAR_TOP / setupWithNavController

易错点

Compose 不会自动写这几行,底栏要点一次抄一次

navArgument

干什么

路径/查询参数声明类型。

怎么写

composable("detail/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType }))

XML 对照

<argument> / Safe Args / putExtra

易错点

特殊字符要 Uri.encode;只传 id 不传整页对象

SavedStateHandle 返回传值

干什么

详情改完,通知列表刷新。

怎么写

nav.previousBackStackEntry?.savedStateHandle?.set("needRefresh", true)

XML 对照

setResult / setFragmentResult

易错点

必须写 previous,不是 current

navDeepLink

干什么

URL / 推送打开指定目的地。

怎么写

deepLinks = listOf(navDeepLink { uriPattern = "https://…/{id}" })

XML 对照

<deepLink app:uri> + intent-filter

易错点

Manifest 仍要声明,和 XML 时代一样

LazyColumn / items

干什么

惰性列表

怎么写

LazyColumn { items(list, key=…) { } }

XML 对照

RecyclerView

易错点

用 Column 硬塞长列表

PullToRefreshBox

干什么

下拉触发重新加载,转圈由 isRefreshing 驱动。

怎么写

PullToRefreshBox(isRefreshing, onRefresh) { LazyColumn(Modifier.fillMaxSize()) }

XML 对照

SwipeRefreshLayout

易错点

必须包在列表外面,不要放进 item

PullToRefreshState 自定义指示器

干什么

用下拉进度画品牌动画,不重写手势。

怎么写

indicator = { Icon(Modifier.graphicsLayer { rotationZ = state.distanceFraction * 180f }) }

XML 对照

自定义 SwipeRefresh Header

易错点

松手后 fraction 回 0,刷新中要改用 Infinite 连转

PagingSource / Pager

干什么

按页向接口要数据;VM 里 cachedIn 抗旋转。

怎么写

Pager(PagingConfig(20)) { NewsPagingSource(api) }.flow.cachedIn(viewModelScope)

XML 对照

同一套 Paging 3,RV 用 PagingDataAdapter

易错点

页码只来自 params.key;空列表要 nextKey=null

collectAsLazyPagingItems

干什么

Compose 列表收集分页,并用 loadState 画三态。

怎么写

val items = vm.pages.collectAsLazyPagingItems(); items.refresh() / items.retry()

XML 对照

PagingDataAdapter.loadStateFlow

易错点

下一页靠滑动;refresh 是整表重来

Modifier.padding/background

干什么

间距与背景

怎么写

Modifier.background(…).padding(…)

XML 对照

padding/background 属性

易错点

顺序决定结果

Scaffold

干什么

页面标准壳

怎么写

Scaffold(topBar=…){ padding -> … }

XML 对照

AppBar+根布局

易错点

忽略 innerPadding

AlertDialog

干什么

状态驱动对话框

怎么写

if (open) AlertDialog(…)

XML 对照

AlertDialog.Builder

易错点

关闭不改状态

OutlinedTextField

干什么

受控输入框

怎么写

OutlinedTextField(value, onValueChange)

XML 对照

EditText

易错点

缺少 onValueChange

stringResource

干什么

读字符串资源

怎么写

Text(stringResource(R.string.x))

XML 对照

@string

易错点

写死文案难翻译

MaterialTheme / colorScheme

干什么

全 App 颜色、字阶、形状入口;业务读令牌。

怎么写

Text(color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyLarge)

XML 对照

themes.xml / ?attr/colorOnSurface

易错点

主色上的字用 onPrimary,不要写死 White

isSystemInDarkTheme

干什么

读系统深浅;和用户三态合成 darkTheme。

怎么写

AppTheme(darkTheme = mode.toDark(isSystemInDarkTheme()))

XML 对照

values-night + setDefaultNightMode

易错点

边到边后还要改 isAppearanceLightStatusBars

pluralStringResource

干什么

复数文案;图用 painterResource。

怎么写

pluralStringResource(R.plurals.item_count, n, n)

XML 对照

@plurals / getQuantityString

易错点

VM 里不要 context.getString;UI 读资源 id

contentDescription

干什么

读屏听到的名字;装饰图传 null。

怎么写

Icon(Icons.Default.ArrowBack, contentDescription = "返回")

XML 对照

android:contentDescription

易错点

图标+文字行用 mergeDescendants,图标侧传 null

dynamicLightColorScheme

干什么

Android 12+ 按壁纸生成配色。

怎么写

if (SDK >= 31) dynamicDarkColorScheme(context) else darkScheme

XML 对照

易错点

始终用 onPrimary,不要假设主色一定够深

remember(keys) / key

干什么

身份变化时重置局部状态。

怎么写

remember(userId) { … } 或 key(id) { … }

XML 对照

换业务 id 时清字段

易错点

固定 remember 导致串用户数据

Saver / listSaver

干什么

让复杂对象能 rememberSaveable。

怎么写

rememberSaveable(stateSaver = …)

XML 对照

自定义 onSaveInstanceState

易错点

会话级数据应放 ViewModel

snapshotFlow

干什么

Compose State 变成 Flow。

怎么写

snapshotFlow { listState.firstVisibleItemIndex }

XML 对照

滚动监听记位置

易错点

收集放 Effect;块内只读 State

combine + stateIn

干什么

VM 多源合成一份热 StateFlow。

怎么写

combine(…).stateIn(viewModelScope, WhileSubscribed(5_000), …)

XML 对照

MediatorLiveData 合并

易错点

界面页优先 WhileSubscribed

mutableStateListOf / Map

干什么

可观察集合,增删改驱动重组。

怎么写

val list = remember { mutableStateListOf(...) }

XML 对照

改数据后 notify Adapter

易错点

普通 List 原地修改界面不更新

derivedStateOf

干什么

由其他 State 派生,减少无用重组。

怎么写

val x by remember { derivedStateOf { ... } }

XML 对照

每次数据变手动重算

易错点

依赖非 State 且 key 不对会陈旧

produceState

干什么

组合内异步结果变成 State。

怎么写

val v by produceState(initial, key) { value = ... }

XML 对照

回调里 setText

易错点

正式业务仍优先 VM

rememberUpdatedState

干什么

长 Effect 里总用最新回调。

怎么写

val current by rememberUpdatedState(onEvent)

XML 对照

Compose 特有

易错点

LaunchedEffect(Unit) 直接调过期 lambda

LiveData.observeAsState

干什么

遗留 LiveData 桥成 Compose State。

怎么写

val v by liveData.observeAsState()

XML 对照

observe(owner)

易错点

长期应迁到 Flow

mutableIntStateOf

干什么

基本类型 State,减少装箱。

怎么写

var n by remember { mutableIntStateOf(0) }

XML 对照

基本类型字段

易错点

仍需 remember / Saveable

animate*AsState

干什么

目标值变了,当前值平滑追过去。

怎么写

val w by animateDpAsState(if (on) 200.dp else 80.dp, label = "w")

XML 对照

ObjectAnimator / ViewPropertyAnimator

易错点

组件进出不要用它,用 AnimatedVisibility

AnimatedVisibility

干什么

布尔控制一块 UI 进出组合。

怎么写

AnimatedVisibility(visible, enter = fadeIn(), exit = fadeOut()) { … }

XML 对照

animateLayoutChanges

易错点

退出动画未结束不要另开 AsState 改 alpha

AnimatedContent

干什么

同一槽位按状态换内容并过渡。

怎么写

AnimatedContent(state, label = "s") { when (it) { … } }

XML 对照

ViewSwitcher / ViewFlipper

易错点

lambda 里要用参数 it,不要读外面的最新值

Modifier.animateContentSize

干什么

子内容变高变宽,容器平滑跟着长。

怎么写

Column(Modifier.animateContentSize()) { … }

XML 对照

animateLayoutChanges

易错点

和 AnimatedVisibility 叠在同一节点会抢尺寸

Modifier.animateItem()

干什么

Lazy 增删重排时条目自己滑。

怎么写

items(list, key = { it.id }) { Row(Modifier.animateItem()) }

XML 对照

RecyclerView.ItemAnimator

易错点

必须稳定 key;旧 API animateItemPlacement 已过时

rememberInfiniteTransition

干什么

循环旋转、呼吸灯、骨架闪动。

怎么写

val inf = rememberInfiniteTransition(label); inf.animateFloat(…)

XML 对照

repeatCount = INFINITE

易错点

离开可见性后要卸掉,别在预加载页空转

spring / tween

干什么

动画规格:弹簧或固定时长。

怎么写

animationSpec = spring() 或 tween(220, easing = FastOutSlowInEasing)

XML 对照

Interpolator + duration

易错点

跟手拖拽用 spring,不要用 tween

updateTransition

干什么

一个状态同时驱动多个属性。

怎么写

val t = updateTransition(state, label); t.animateDp { … }

XML 对照

AnimatorSet

易错点

只有多属性必须齐步才用

Animatable

干什么

手势跟手、顺序动画、甩动衰减。

怎么写

scope.launch { x.animateTo(0f, spring()) }

XML 对照

ValueAnimator

易错点

只能在协程里 animateTo;并发会互斥取消

SharedTransitionLayout

干什么

缩略图飞到详情的共享元素。

怎么写

Modifier.sharedElement(rememberSharedContentState(key), this)

XML 对照

Activity 共享元素

易错点

必须同一 Layout 子树;导航要把 Scope 往下传

Crossfade

干什么

两个状态交叉淡入,Content 的简化版。

怎么写

Crossfade(targetState = tab, label = "tab") { … }

XML 对照

易错点

需要滑入/展开时不要用它

Android Compose 现代开发知识体系 · 主线必读 / 扩展选读。
术语表常驻;组件与属性先看分讲,再查两张总表。案例默认收起。