本文内容来自 Android Developers Blog: What’s new in the Jetpack Compose January ’24 release

前几篇文章:
1.3.0:Jetpack Compose 上新:瀑布流布局、下拉加载、DrawScope.drawText
1.4.0:Jetpack Compose 上新:Pager、跑马灯、FlowLayout
1.5.0:Jetpack Compose 1.5 上新:功能升级,内存优化

2024年1月24日,在历经了长达三个半月的等待后,Jetpack Compose 1.6 终于是姗姗来迟。这一版别专心于功能表现,团队持续完成着 Modifier 体系的搬迁(搬迁到 Modifier.Node 体系,详情见前几次的更新),并持续改进主要 API 的效率。

这一版别的 BOM 为 2024.01.00

implementation platform('androidx.compose:compose-bom:2024.01.00')

功能

功能仍然是 Compose 团队的最高优先级,这次更新在 1.5 基础 上进一步带来了翻滚功能 ~20% 、以及发动时刻 12% 的进步(根据它们的 benchmark)!而在 1.5 的那次 Release 中,大部分 App 现已能够经过升级版别看到这些改变(代码都不必改)。

对翻滚和发动时刻的优化来自于团队在内存分配、懒加载上的持续优化,以保证框架仅在必要情况下才执行。这些进步能够在 Compose 的各种 API 中得以表现,尤其是 Text、clickable、Lazy List 和 Graphics(包含 Vectors)。

团队也写了一份攻略,协助你根据 Modifier.Node 编写自己的 Modifier,见:developer.android.com/jetpack/com…

为外部类指定稳定性(Stability)

Compose Compiler 1.5.5 引入了一个新的选项,可提供一个配置文件以指明哪些类是 stable 的。此选项能允许你将任何类标为 Stable 的,包含自己模块的、外部库、标准库等,而无需修正这些模块或者包裹一层

注,以前的解决方案要么自己写一份,要么包一层,类似于

// 外部类
class UnstableClass(xxx)
​
// 自己的模块
@Stable
class Wrapper(val impl: UnstableClass)

从前的方式仍然可用,新的方式能让你更便利的额定告诉 Compose Compiler 哪些应该被视为 Stable。关于怎么运用此配置,见此 创立自定义修饰符 | Jetpack Compose | Android Developers

生成代码的功能

Compose 编译器插件生成的代码也得到了改进。对这些代码进行细小调整能够带来巨大的功能改进,由于每个 Composable 中都会生成它们。Compose 编译器跟踪 Compose State 目标,以了解在值产生更改时应重组哪些 Composable ;然而,许多 State 的 value 仅会被读取一次,而有些根本不被读取,却仍经常产生更改!此更新允许编译器越过不必要的跟踪。

Compose Compiler 1.5.6 还默许启用了 “固有记忆(intrinsic remember)”形式。该形式在编译时转换 remember,并会考虑用作 rememberkeys 的各种 Composable 参数的信息。这加快了确定 remember 的值否需要从头核算的过程,但也意味着如果在调试过程中,在 remember 函数内设置断点,它可能不再被调用:由于编译器现已移除了 remember 的运用并用不同的代码替换了它。

实验性 强越过形式

咱们还在努力使您编写的代码天然变得更高效。咱们希望为您直观编写的代码进行优化,而无需深入了解 Compose 内部原理来弄懂解 “为什么我的 Composable 莫名其妙重组了,不应该啊”

Compose 的此版别增加了对 “强越过形式(Strong Skipping Mode)” 的实验性支撑。强越过形式放宽了有关哪些更改能够越过重组的规矩,更倾向于开发人员的希望。启用强越过形式后,如果将相同的目标实例传递给其参数,具有不稳定参数的 Composable 也能够越过重组。此外,强越过形式还主动记住涉及不稳定值的 lambda(当时仅记住全 Stable 的 lambda)。

强越过形式目前处于实验阶段,默许情况下处于禁用状况,由于咱们以为它尚未准备好供生产运用。它预计将于 Compose 1.7 默许启用,在此之前,咱们将持续评价其作用。请参阅咱们的 攻略 以测验强越过形式并协助咱们找到任何问题。

文本

默许字体填充(Padding)的更改

此版别现在将 includeFontPadding 设置默许为 false。includeFontPadding 是一个留传属性,根据文本的第一行顶部和最终一行底部的字体度量值增加额定的 Padding。将此设置默许为 false 使默许文本布局更契合常见的设计东西,使其更容易与生成的设计规范匹配。升级到2024年1月发布版后,您可能会在文本布局和屏幕截图测验中看到细微改变。有关此设置的更多信息,请参阅 Fixing Font Padding in Compose Text 博文和 开发人员文档

Jetpack Compose 1.6 上新:翻滚功能进步 20%!

非线性字体缩放的支撑

2024年1月发布版运用非线性字体缩放来进步文本的可读性和可拜访性。非线性字体缩放经过使用非线性缩放曲线,避免屏幕上的大文本元素过大缩放。这种缩放战略意味着大文本的缩放倍率与较小文本不同。

拖放

Compose Foundation 增加了对渠道级拖放的支撑,使内容能够在多窗口形式下的设备上在使用程序之间进行拖放。该 API 与 View API 完全兼容,这意味着从View 开端的拖放能够拖到 Compose 中,反之亦然。要运用此API,请参阅代码示例

其他改变

此版别还包含如下改变:

  • 在 Lazy lists 中支撑了 LookaheadScope
  • 修正了 在 Lazy List 中不活泼但仍存活(为了复用)的 composables 在默许情况下未被语义树正确过滤
  • 动画中支撑 根据 Spline 的 keyframes
  • 增加支撑 鼠标选择,包含文本

开端吧

由衷感谢一切在 issue tracker 提出的 bug 报告和 feature requests,这协助咱们优化 Compose,并构建你所希望的 API。欢迎持续为咱们提出反应,协助 Compose 变得更好!

想看看接下来会产生什么?看看咱们的 路线图,了解咱们目前所想、所做的。

Happy Composing!


原文完毕。

实践 APK 体会

光说不练假把式,实践到底是什么作用也只要真的运转下才知道。正好我自己保护的开源一对多+大模型翻译软件 FunnySaltyFish/FunnyTranslation: 根据Jetpack Compose开发的翻译软件,支撑多引擎、插件化~ | Jetpack Compose+MVVM+协程+Room 就有现成的代码,我临时升级到 Compose 1.6(其余无更改) ,打了一个 release 的共存包(在原包名基础上增加了 .tmp 后缀,各位有爱好能够自己下载体会体会

其间的 侧边栏-致谢 为长分页列表,能够自己滑动试试

别的,这个项目正在向 Kotlin + Compose 跨渠道搬迁,目前现已跑起来了,有爱好的同学欢迎前往 FunnySaltyFish/Transtation-KMP: A translation app on Android/Desktop built by Kotlin Multiplatform + Compose Multiplatform, enjoy amazing experience with LLMs’ support 体会