Compose 四月稳定版来袭,测试、触控、预览工具全线革新

本文首发于公众号"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.scrollableModifier.transformable 吃到。

内置文本里还有一串桌面向行为:双击/三击选区、更像桌面的文本上下文菜单、拖放起始手势 等,对折叠屏 + 键盘盖、Chromebook 类场景更友好。

测试侧新增了 performTrackpadInput ,专门用来验触控板路径。若你写了自定义手势,记得 触摸 / 鼠标 / 触控板 / 笔 四条线都过一遍。

Runtime:HostDefaultProvider

Compose runtime 里新增了 HostDefaultProviderLocalHostDefaultProviderHostDefaultKeyViewTreeHostDefaultKey 这一套。

意图很简单:库作者要在 composition 上挂主机级服务时,不必为了查默认值去依赖 compose-ui ,对 Kotlin Multiplatform 更友好。库侧可以用 compositionLocalWithHostDefaultOfCompositionLocal,默认值从 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

#JetpackCompose #Android开发 #Kotlin #Compose测试 #跨端UI

相关推荐
克里斯蒂亚诺更新2 小时前
uniapp适配H5和Android-apk实现获取当前位置经纬度并调用接口
android·前端·uni-app
咚咚王者2 小时前
MySQL 导出脚本
android·mysql·adb
Fate_I_C2 小时前
Android Navigation的使用说明
android·kotlin·navigation
JJay.2 小时前
高通 GAIA v1/v2/v3 共存时,Android 端该怎么做协议分层
android
哑巴湖小水怪12 小时前
Android的架构是四层还是五层
android·架构
2501_9160088914 小时前
深入解析iOS应用启动性能优化策略与实践
android·ios·性能优化·小程序·uni-app·cocoa·iphone
美狐美颜SDK开放平台15 小时前
短视频/直播双场景美颜SDK开发方案:接入、功能、架构详解
android·ios·美颜sdk·第三方美颜sdk·视频美颜sdk
untE EADO15 小时前
在 MySQL 中使用 `REPLACE` 函数
android·数据库·mysql
iblade16 小时前
Android CLI And Skills 3x faster
android