前言
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 对齐。
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、动画轨迹、匹配数量都能看见。
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、假数据注入这类重复代码收敛掉。
class ThemeWrapper:PreviewWrapper{@Composable override fun Wrap(content: @Composable()->Unit){JetsnackTheme{content()}}}@PreviewWrapperProvider(ThemeWrapper::class)@Preview @Composable private funButtonPreview(){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。
[#JetpackCompose](javascript:😉 [#Android开发](javascript:😉 [#Kotlin](javascript:😉 [#Compose测试](javascript:😉 [#跨端UI](javascript:😉