SuperAPI AI 工具集

avoiding-subcomposition-pitfalls

通用与其它

查看项目

更新于 10-16 00:21

技能介绍

该技能面向 Jetpack Compose 性能优化,核心是避免把组合放进测量阶段。SubcomposeLayout 在测量阶段执行子内容组合,BoxWithConstraints、material3.Scaffold 和懒加载布局都基于它,代价在嵌套或热路径中才显现。

用途:当开发者报告多余测量、首帧慢、旋转或弹键盘时卡顿、懒列表滚动卡顿,或 Perfetto 追踪显示测量阶段组合随父约束变化增长时使用。

主要能力与做法:

  1. 排查热路径中所有 SubcomposeLayout 使用者(BoxWithConstraints、Scaffold、自定义布局)。
  2. 判断约束是否真的在组合期被消费;仅用于读取 maxWidth/maxHeight 时改用 Modifier.onSizeChanged 或 Modifier.layout。
  3. 避免嵌套子组合布局,把 BoxWithConstraints 提到根节点,用普通布局处理内部分支。
  4. 不在 LazyColumn/LazyRow/LazyVerticalGrid 的 item 中放 BoxWithConstraints,由父级解析后传值。
  5. 不嵌套 Scaffold,使用其 topBar、bottomBar、snackbarHost、floatingActionButton 插槽。
  6. 确需 SubcomposeLayout 时传入 SubcomposeSlotReusePolicy(如 maxSlotsToRetainForReuse = 8),可预测的槽位用 state.precompose。
  7. 用 Perfetto 与 Layout Inspector 验证 Compose:recompose 和 Compose:applyChanges 不再随父约束变化触发。

限制:当子内容组合确实依赖已测量尺寸(如共享元素、锚点弹层)时不应替换,应保留并调优。此技能针对子组合问题;若慢因是参数不稳定或动画状态读取,应改用稳定性诊断或状态读取延迟技能。资料未提供具体收费、平台或安装信息。