Jetpack Compose 2025 年4月版本更新内容总结

Jetpack Compose 2025 年4月版本更新内容总结

发布者:Jolanda Verhoef – 开发者关系工程师

今天,作为 Compose 2025年4月物料清单 (BOM) 的一部分,我们发布了 Jetpack Compose(Android 的现代原生 UI 工具包,已被众多开发者采用)的 1.8 版本。此版本包含新功能,如自动填充 (autofill)、多项文本改进、可见性跟踪 (visibility tracking) 以及为可组合项 (composable) 的大小和位置添加动画的新方法。它还稳定了许多实验性 API 并修复了若干错误。

要使用今天的版本,请将你的 Compose BOM 版本升级至 2025.04.01

implementation(platform("androidx.compose:compose-bom:2025.04.01"))

注意: 如果你未使用物料清单 (Bill of Materials),请确保同时升级 Compose Foundation 和 Compose UI。否则,自动填充功能将无法正常工作。

自动填充 (Autofill)

自动填充 是一项简化数据输入的服务。它使用户无需手动输入每个细节即可填写表单、登录屏幕和结账流程。现在,你可以将此功能集成到你的 Compose 应用程序中。

在 Compose 文本字段中设置自动填充非常简单:

  1. 设置语义内容类型 (Semantics contentType):使用 Modifier.semantics 并为你的文本字段设置适当的 contentType。例如:
    TextField(
        state = rememberTextFieldState(),
        modifier = Modifier.semantics { contentType = ContentType.Username }
    )
    
  2. 处理保存凭据(用于新的或更新的信息):
    a. 通过导航隐式保存:如果用户离开页面,commit() 将自动调用——无需编写代码!
    b. 通过按钮显式保存:要在用户提交表单时(例如点击按钮)触发保存凭据,需检索本地 AutofillManager 并调用 commit()

有关如何在应用程序中实现自动填充的完整详细信息,请参阅 Compose 中的自动填充文档

文本 (Text)

现在,在容器内放置文本时,你可以在 BasicText 中使用 autoSize 参数,让文本大小自动适应容器大小:

Box {
    BasicText(
        text = "Hello World",
        maxLines = 1,
        autoSize = TextAutoSize.StepBased()
    )
}

容器内 Hello World 文本的动态图像

你可以通过设置最小和/或最大字体大小以及定义步长来 自定义 调整大小。Compose Foundation 1.8 包含这个新的 BasicText 重载,Material 1.4 也将很快跟进一个更新的 Text 重载。

此外,Compose 1.8 通过新的 TextOverflow.StartEllipsisTextOverflow.MiddleEllipsis 选项增强了文本溢出处理功能,允许你在文本行的开头或中间显示省略号。

val text = "This is a long text that will overflow"
Column(Modifier.width(200.dp)) {
    Text(text, maxLines = 1, overflow = TextOverflow.Ellipsis)
    Text(text, maxLines = 1, overflow = TextOverflow.StartEllipsis)
    Text(text, maxLines = 1, overflow = TextOverflow.MiddleEllipsis)
}

在文本行开头和中间显示省略号的文本溢出处理

最后,我们扩展了 AnnotatedString 中对 HTML 格式化的支持,增加了对项目符号列表的支持:

Text(
    AnnotatedString.fromHtml(
        """
        <h1>HTML content</h1>
        <ul>
            <li>Hello,</li>
            <li>World</li>
        </ul>
        """.trimIndent()
    )
)

包含两个项目的项目符号列表

可见性跟踪 (Visibility tracking)

Compose UI 1.8 引入了一个新的修饰符:onLayoutRectChanged。此 API 解决了现有 onGloballyPositioned 修饰符解决的许多用例;但是,它的开销要小得多。onLayoutRectChanged 修饰符可以根据用例需求对回调进行防抖 (debounce) 和节流 (throttle),当它被添加到 LazyColumnLazyRow 中的项目时有助于提高性能。

这个新的 API 解锁了依赖于可组合项在屏幕上可见性的功能。Compose 1.9 将在此底层 API 上添加更高级别的抽象,以简化常见用例。

为可组合项边界添加动画 (Animate composable bounds)

去年我们推出了共享元素过渡,它可以为应用程序中的内容添加流畅的动画。1.8 版本的动画模块将 LookaheadScope 升级为稳定版,包含大量性能和稳定性改进,并包含一个新的修饰符 animateBounds。当在 LookaheadScope 内部使用时,此修饰符会在其可组合项的大小和屏幕位置发生变化时自动为其添加动画:

Box(
    Modifier
        .width(if(expanded) 180.dp else 110.dp)
        .offset(x = if (expanded) 0.dp else 100.dp)
        .animateBounds(lookaheadScope = this@LookaheadScope)
        .background(Color.LightGray, shape = RoundedCornerShape(12.dp))
        .height(50.dp)
) {
    Text("Layout Content", Modifier.align(Alignment.Center))
}

描绘可组合项边界动画的动态图像

提高 API 稳定性 (Increased API stability)

Jetpack Compose 利用 @Experimental 注解来标记可能在各个版本中发生变化的 API,这些功能需要超过库的 alpha 期才能稳定。我们收到了你们的反馈,许多功能被标记为实验性已有一段时间且没有变化,这带来了一种不稳定的感觉。我们正在积极致力于稳定现有的实验性 API——在 UI 和 Foundation 模块中,我们已将实验性 API 的数量从 1.7 版本的 172 个减少到 1.8 版本的 70 个。我们计划在未来的版本中继续这种跨模块的稳定化趋势。

弃用上下文流式行和列 (Deprecation of contextual flow rows and columns)

作为减少实验性注解工作的一部分,我们识别出了在近期版本中添加的、对其用例而言并非最佳解决方案的 API。这导致了决定弃用在 Foundation 1.7 中添加的实验性 ContextualFlowRowContextualFlowColumn API。如果你需要已弃用的功能,我们目前的建议是复制实现并根据需要进行调整,同时我们正在制定计划,未来推出能更好覆盖这些功能的组件。

相关的 API FlowRowFlowColumn 现已稳定;然而,在上个版本中添加的新 overflow 参数现在已被弃用。

核心功能的改进和修复 (Improvements and fixes for core features)

根据开发者的反馈,我们在核心库中发布了一些特别受欢迎的功能和错误修复:

原文地址:https://android-developers.googleblog.com/2025/04/whats-new-in-jetpack-compose-april-25.html

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗