本文首发于公众号"Android技术圈"
前言
Google 在 Jetpack Compose April 2026 里把 Compose 1.11.0 标成稳定,BOM 落到 2026.04.01。
这一版里,真正会立刻动到你工程的有三条线:Compose UI 测试默认走 v2 调度 、触控板事件按鼠标而不是假触摸 、以及 Shared Element / Preview / runtime 主机默认值 这一圈工具链补齐。其余大量新能力还在 @Experimental 里,适合提前试,不适合默认进业务主干。
官方说明见:What's new in the Jetpack Compose April '26 release。

升级BOM
Gradle 里把 BOM 指到官方给的坐标即可,其它 Compose artifact 版本交给 BOM 对齐。
bash
dependencies {
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
}
如果你不用 BOM,记得 Foundation / UI 等同升,否则容易出现组件版本错配(这类问题排查起来很费时间)。
Compose UI 测试
Compose 1.10 里已经预告过,这次 v2 testing API 直接默认启用,v1 标记弃用。
差异核心是 TestDispatcher :v1 用 UnconfinedTestDispatcher,协程 launch 后几乎立刻跑完;v2 换成 StandardTestDispatcher,任务先进队列,只有你推进虚拟时钟(例如 advanceUntilIdle)才会执行。
对工程的意义很直接:
-
• 更接近生产里的调度顺序,更容易把"靠运气通过"的竞态测挂,长期看 CI 更干净。
-
• 反过来,以前依赖"立刻执行完"的测试要改,否则升级当天就会红一片。
官方迁移文档:Testing v2 migration guide。

LookaheadAnimationVisualDebugging
做 SharedTransitionLayout / Modifier.animatedBounds 时,匹配不到、轨迹怪、边界跳 这类问题以前主要靠猜。
现在可以用 LookaheadAnimationVisualDebugging 包一层,直接叠一层调试信息:目标 bounds、动画轨迹、匹配数量 都能看见。
bash
LookaheadAnimationVisualDebugging(
overlayColor = Color(0x4AE91E63),
isEnabled = true,
multipleMatchesColor = Color.Green,
isShowKeylabelEnabled = false,
unmatchedElementColor = Color.Red,
) {
SharedTransitionLayout {
CompositionLocalProvider(LocalSharedTransitionScope provides this) {
// 你的内容
}
}
}
这类工具的价值在于:把运行时布局决策可视化,减少"动画代码写得对,但匹配条件错了"的无效排查。
基础事件归PointerType.Mouse
笔记本触控板、平板外接触控板,以前不少事件被当成 PointerType.Touch 的假手指 ,结果是 按下拖动像在滚屏,选不中。
1.11 把基础触控板事件 对齐到 PointerType.Mouse ,和鼠标行为一致。平台从 API 34 起识别的 双指滑动、捏合 等分类,也会更自然地被 Modifier.scrollable、Modifier.transformable 吃到。
内置文本里还有一串桌面向行为:双击/三击选区、更像桌面的文本上下文菜单、拖放起始手势 等,对折叠屏 + 键盘盖、Chromebook 类场景更友好。
测试侧新增了 performTrackpadInput ,专门用来验触控板路径。若你写了自定义手势,记得 触摸 / 鼠标 / 触控板 / 笔 四条线都过一遍。

Runtime:HostDefaultProvider
Compose runtime 里新增了 HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey、ViewTreeHostDefaultKey 这一套。
意图很简单:库作者要在 composition 上挂主机级服务时,不必为了查默认值去依赖 compose-ui ,对 Kotlin Multiplatform 更友好。库侧可以用 compositionLocalWithHostDefaultOf 建 CompositionLocal,默认值从 host 解析。
这条对写跨端 Compose 库的读者更关键;业务 App 多数先感知为"依赖图更干净、官方在铺 kmp 地基"。
PreviewWrapper 统一主题和预览
Studio 的 Custom Previews 允许你定义预览里 怎么包一层再渲染。
做法是实现 PreviewWrapperProvider,再用 @PreviewWrapper 标在带 @Preview / @MultiPreview 的 @Composable 上,把 Theme、Locale、假数据注入这类重复代码收敛掉。
bash
class ThemeWrapper : PreviewWrapper {
@Composable
override fun Wrap(content: @Composable () -> Unit) {
JetsnackTheme {
content()
}
}
}
@PreviewWrapperProvider(ThemeWrapper::class)
@Preview
@Composable
private fun ButtonPreview() {
Button(onClick = {}) {
Text(text = "Demo")
}
}
两个API被废弃
-
•
Modifier.onFirstVisible()弃用 :名字在 Lazy 场景里容易误解(滚动中会多次触发)。官方建议迁到Modifier.onVisibilityChanged(),自己按阈值做可见性状态。 -
•
ComposeFoundationFlags.isTextFieldDpadNavigationEnabled删除 :D-pad 在TextField里默认开启,游戏手柄 / 电视遥控器方向键先移动光标,到行尾才交焦点给下一个控件。
1.12 预告:compileSdk 37 + AGP 9
官方提前打了招呼:Compose 1.12.0 会把 compileSdk 抬到 37,依赖 Compose 的 App 和库会跟着继承这条要求。
这和 AGP 大版本、compileSdk 支持矩阵有关,升级前把 AGP API level support 打开对照一下,避免"只升 Compose 不升 AGP"卡死在编译期。
最后
如果你已经在 Compose 主分支上,这次升级的第一刀往往是测试:先把 v2 调度迁移跑通,再验收触控板相关交互,最后按需开实验 API。
写业务的同学优先跟 BOM + 测试 + 触控板 ;写库和 Design System 的同学多看 HostDefault + Styles + PreviewWrapper。