android compose 知识点

一、基础与原理

  1. ★ Compose 是什么?和传统 View 有什么区别?

    要点:声明式 UI、状态驱动、Kotlin 编译器插件、组合优于继承、无 XML;View 是命令式、手动操作 View 树、findViewById。Compose 通过重组更新 UI。

  2. @Composable 是什么?有什么限制?

    要点:标记 Compose 函数,编译器会转换并插入 Composer;只能在 Compose 上下文中调用;通常返回 Unit;不应直接写副作用;可返回值但不推荐复杂返回。

  3. ★ 什么是重组 Recomposition?什么是智能重组?

    要点:状态变化后重新执行相关 Composable;Compose 只重组读取了该 State 的最近作用域;可跳过未变化的 Composable。

  4. ★ Compose 的三个阶段?

    要点:Composition → Layout → Drawing。

    Composition 读状态会触发重组;Layout 读状态只触发布局;Drawing 读状态只触发重绘。利用 lambdadrawBehindgraphicsLayer 可延迟读取优化性能。

  5. ★ Compose 快照系统 Snapshot 是什么?

    要点:mutableStateOf 基于 Snapshot。读取会记录依赖,写入会通知快照系统,Recomposer 调度重组。它让状态变更可观察、可批量。

  6. Compose 编译器插件做了什么?

    要点:把 @Composable 函数转成 IR,加入 Composer、Group、changed 检查、跳过逻辑,判断函数是否可跳过、可重启。

二、状态管理

  1. StateMutableStatemutableStateOfremember 关系?

    要点:State<T> 只读,MutableState<T> 可写;mutableStateOf 创建状态;remember 跨重组缓存对象,避免每次重组重新创建。

  2. rememberrememberSaveable 区别?

    要点:remember 在配置变更、进程死亡后丢失;rememberSaveable 保存到 SavedStateRegistry/Bundle,可恢复;支持基本类型、Parcelable、Serializable,自定义需 Saver

  3. ★ 什么是状态提升 State Hoisting?

    要点:把状态从子组件移到父组件,子组件通过参数接收值、通过回调发出事件。好处:单一数据源、单向数据流、可复用、可测试。

  4. derivedStateOf 有什么用?

    要点:基于其他 State 派生状态。当依赖频繁变化但结果变化不频繁时,可减少重组。通常写成 remember { derivedStateOf { ... } }

  5. ★ 状态读取位置为什么重要?

    要点:状态在哪个作用域被读取,写入时就可能只重组该作用域。把读取延迟到 lambda、布局或绘制阶段,可减少重组范围。

  6. ★ ViewModel 在 Compose 中怎么用?

    要点:viewModel() 获取,UI 状态用 StateFlow,通过 collectAsStateWithLifecycle() 收集;事件调用 ViewModel 方法;UI State 推荐不可变 data class。

三、副作用 Effect

  1. LaunchedEffect 作用?

    要点:进入组合时启动协程;key 改变时取消并重启;离开组合时取消。用于挂起任务,如请求、监听。

  2. DisposableEffect 作用?

    要点:需要清理的副作用。key 改变或离开组合时执行 onDispose,如注销监听、释放资源。

  3. SideEffect 作用?

    要点:每次成功重组后执行,非挂起。用于把 Compose 状态发布到非 Compose 管理对象。

  4. rememberCoroutineScopeLaunchedEffect 区别?

    要点:rememberCoroutineScope 给事件回调手动启动协程,生命周期随组合;LaunchedEffect 是声明式自动执行副作用。

  5. produceStatesnapshotFlow 区别?

    要点:produceState 把非 Compose 状态转成 StatesnapshotFlow 把 State 读取转成冷 Flow,状态变化时发射。

  6. rememberUpdatedState 作用?

    要点:在长期 Effect 中引用最新值或 lambda,而不因值变化重启 Effect。常用于 LaunchedEffect 中调用最新回调。

  7. 为什么不能在 Composable 中直接发请求或启动协程?

    要点:Composable 会因重组反复执行,直接写会导致重复请求、泄漏。必须用 Effect API 控制生命周期。

四、性能优化

  1. ★ 如何优化 Compose 性能?

    要点:稳定参数、keycontentTyperememberderivedStateOf、延迟状态读取、避免反向写状态、优化 LazyColumn、减少不稳定类型、使用 Baseline Profile。

  2. @Stable@Immutable 区别?

    要点:@Immutable 表示属性不会变;@Stable 表示类型稳定,属性可变但变化会通知 Compose,且 equals 一致。它们帮助编译器判断可跳过。

  3. ★ 为什么 List 在 Compose 中常被认为不稳定?

    要点:List 是可变接口,Compose 无法保证内容不变。可用 ImmutableList@Immutable 包装类。不稳定参数会导致 Composable 无法跳过。

  4. ★ LazyColumn 如何优化?

    要点:提供稳定唯一 key;按 item 类型提供 contentType;避免同方向嵌套滚动;用 contentPadding;状态用 rememberLazyListState

  5. ★ Modifier 顺序为什么重要?

    要点:Modifier 链有序,影响布局、点击区域、背景、绘制。例如 padding().background()background().padding() 效果不同。

  6. 什么是重组作用域?

    要点:非 inline 的 Composable 通常生成重组作用域,可独立跳过。inline Composable 可能合并作用域。

五、UI、布局、主题

  1. Column、Row、Box、ConstraintLayout、Scaffold 区别?

    要点:Column/Row 线性布局,Box 层叠,ConstraintLayout 复杂约束,Scaffold 提供 Material 页面结构:TopBar、Snackbar、FAB 等。

  2. 如何自定义 Layout?

    要点:使用 Layout + MeasurePolicy;固有测量 IntrinsicSizeSubcomposeLayout 用于先测量再组合,如 Lazy 布局。

  3. Compose 动画常用 API?

    要点:animate*AsStateAnimatedVisibilityCrossfadeupdateTransitionrememberInfiniteTransition

  4. CompositionLocal 是什么?

    要点:隐式向下传递数据,如 MaterialThemeLocalContextcompositionLocalOf 跟踪读取,staticCompositionLocalOf 不跟踪读取。不要滥用。

六、互操作、架构、测试

  1. ★ Compose 和 View 如何互操作?

    要点:Compose 中用 AndroidView 包装 View;XML/View 中用 ComposeView 嵌入 Compose;注意 ViewCompositionStrategy 生命周期。

  2. ★ Navigation Compose 怎么用?

    要点:rememberNavControllerNavHostcomposablenavigate、参数传递。类型安全导航可用 Kotlin Serialization 的 @Serializable 路由。

  3. ★ Hilt 在 Compose 中怎么用?

    要点:@HiltViewModel 标记 ViewModel,Composable 中用 hiltViewModel() 获取。

  4. ★ Compose 测试怎么做?

    要点:createComposeRule / createAndroidComposeRulesetContentonNodeWithTextonNodeWithTagperformClickassertIsDisplayedwaitUntil

  5. Compose 中如何处理生命周期?

    要点:Flow 用 collectAsStateWithLifecycle();副作用可用 LifecycleEventEffectLifecycleResumeEffect;Activity Result 用 rememberLauncherForActivityResult

  6. Paging 在 Compose 中怎么用?

    要点:collectAsLazyPagingItems() 配合 LazyColumn,处理 loading、error、append 状态。

高频追问

  • 为什么状态变化会触发重组?

  • 如何减少不必要的重组?

  • rememberrememberSaveable、ViewModel 分别适合存什么?

  • LaunchedEffectDisposableEffectSideEffect 区别?

  • 什么是稳定类型?为什么要稳定?

  • derivedStateOf 和普通 remember 计算区别?

  • Modifier 顺序为什么会影响点击和背景?

  • LazyColumn 的 keycontentType 有什么用?

  • Compose 性能排查工具?

    答:Layout Inspector 重组计数、Compose Compiler Metrics、Profiler、Baseline Profile。

相关推荐
其实防守也摸鱼2 小时前
Codex 下载与本地部署实战:从安装到运行全指南
android·大数据·运维·安全·自动化
ttyyttemo2 小时前
协程并发执行与共享状态
android
miaowmiaow3 小时前
我让 AI 给老项目做了一次分层架构升级:对标 Now in Android,从「穿层」到「端口与适配器」
android·ai编程·deepseek
mmsx3 小时前
Android 栅格数据缓冲区的类型包装:用匿名子类破解泛型擦除
android·地图·栅格
叶羽西3 小时前
Android Camera HAL调整图像处理线程优先级
android
HouWan3 小时前
Flutter: MediaQuery.of(context) 为什么可能拖慢页面?
android·flutter·ios
事圆则缓4 小时前
Android 图片内存到底怎么算
android
Godikov4 小时前
弱网环境离线优先:Android 终端数据可靠同步架构实战
android