Compose 运行时
androidx.compose.runtime
androidx.compose.runtime.rxjava2
androidx.compose.runtime.rxjava3
androidx.compose.runtime.saveable
androidx.compose.runtime.snapshots
(参阅所有 Compose 软件包的 API 参考文档)
最新更新 | 稳定版发布 | 发布候选版 | Beta 发布 | Alpha 发布 |
---|---|---|---|---|
2025 年 6 月 4 日 | 1.8.2 | - | - | 1.9.0-alpha04 |
结构
Compose 是 androidx
中 7 个 Maven Group ID 的组合。每个组都包含目标功能子集,并各自拥有自己的发布说明。
此表解释了各个组以及指向每组发布说明的链接。
组 | 说明 |
---|---|
compose.animation | 在其 Jetpack Compose 应用中构建动画,以丰富用户体验。 |
compose.compiler | 使用 Kotlin 编译器插件转换 @Composable 函数并启用优化。 |
compose.foundation | 使用现成的构建块编写 Jetpack Compose 应用,并扩展基础以构建您自己的设计系统组件。 |
compose.material | 使用现成的 Material Design 组件构建 Jetpack Compose UI。这是 Compose 的更高级别入口点,旨在提供与 www.material.io 上所述组件相匹配的组件。 |
compose.material3 | 使用 Material Design 3 组件(Material Design 的下一次演进)构建 Jetpack Compose UI。Material 3 包含更新的主题和组件以及 Material You 个性化功能(如动态色彩),旨在与新的 Android 12 视觉样式和系统 UI 保持一致。 |
compose.runtime | Compose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的核心运行时。 |
compose.ui | Compose UI 的基本组件,用于与设备交互,包括布局、绘制和输入。 |
声明依赖项
要添加对 Compose 的依赖项,您必须将 Google Maven 仓库添加到您的项目。请阅读Google Maven 仓库了解更多信息。
将您所需的构件依赖项添加到应用或模块的 build.gradle
文件中
Groovy
dependencies { implementation "androidx.compose.runtime:runtime:1.8.2" implementation "androidx.compose.runtime:runtime-livedata:1.8.2" implementation "androidx.compose.runtime:runtime-rxjava2:1.8.2" } android { buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
Kotlin
dependencies { implementation("androidx.compose.runtime:runtime:1.8.2") implementation("androidx.compose.runtime:runtime-livedata:1.8.2") implementation("androidx.compose.runtime:runtime-rxjava2:1.8.2") } android { buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
有关依赖项的更多信息,请参阅添加构建依赖项。
反馈
您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的建议,请告诉我们。在创建新问题之前,请先查看此库中的现有问题。您可以通过点击星形按钮为现有问题投票。
有关更多信息,请参阅问题跟踪器文档。
运行时跟踪版本 1.7
版本 1.7.0-rc01
2024 年 9 月 18 日
androidx.compose.runtime:runtime-tracing:1.7.0-rc01
已发布。版本 1.7.0-rc01 包含这些提交。
运行时跟踪版本 1.0
版本 1.0.0-beta01
2023 年 11 月 29 日
androidx.compose.runtime:runtime-tracing:1.0.0-beta01
已发布。版本 1.0.0-beta01 包含这些提交。
版本 1.0.0-alpha05
2023 年 11 月 15 日
androidx.compose.runtime:runtime-tracing:1.0.0-alpha05
已发布。版本 1.0.0-alpha05 包含这些提交。
Bug 修复
- 将依赖项固定到支持的最低稳定版本(即
compose-runtime
和tracing-perfetto
)- 修复了compose-runtime-tracing
会将新版compose-runtime
引入应用的问题。
版本 1.0.0-alpha04
2023 年 8 月 23 日
androidx.compose.runtime:runtime-tracing:1.0.0-alpha04
已发布。版本 1.0.0-alpha04 包含这些提交。
新功能
- 兼容最新版
Benchmark
和Tracing Perfetto
,支持在应用启动时(冷启动)进行 Composition 跟踪,例如在AndroidX Benchmark
和Android Studio
中(从Hedgehog Beta 2
开始)。
API 变更
- 将
androidx.tracing.perfetto.Trace
重命名为androidx.tracing.perfetto.PerfettoSdkTrace
。(I44af8) - 使
Tracing Perfetto SDK API
与android.os.Trace
保持一致。(I73ba0、b/282199917) - 应用启动时跟踪的先决条件。(Iad890)
- 合并了实验性和公共 API 文件(I0f2e1、b/278769092)
版本 1.0.0-alpha02
2023 年 2 月 8 日
androidx.compose.runtime:runtime-tracing:1.0.0-alpha02
已发布。版本 1.0.0-alpha02 包含这些提交。
新功能
- 无功能变更。下游依赖项
androidx.tracing:tracing-perfetto*
中有多个性能优化。
版本 1.0.0-alpha01
2022 年 9 月 7 日
androidx.compose.runtime:runtime-tracing:1.0.0-alpha01
已发布。版本 1.0.0-alpha01 包含这些提交。
新功能
androidx.compose.runtime:runtime-tracing
是一个库,在支持它的工具(即将推出)存在的情况下,允许在 Compose 应用中进行扩展跟踪。此初始版本为1.0.0-alpha01
。
版本 1.9
版本 1.9.0-alpha04
2025 年 6 月 4 日
androidx.compose.runtime:runtime-*:1.9.0-alpha04
已发布。版本 1.9.0-alpha04 包含这些提交。
API 变更
SnapshotStateSet
现在在 Android 上实现了Parcelable
,它现在支持作为rememberSaveable { ... }
的一部分使用。(I755dd、b/378623803)SnapshotStateList
现在在 Android 上实现了Parcelable
,它现在支持作为rememberSaveable { ... }
的一部分使用。(Id18be、b/378623803)movableContentOf()
现在带有@RememberInComposition
注解,这允许lint
捕获不正确的用法(I2738d)- 更新了实验性组合观察器 API,以允许更全面地观察重新组合的原因(I32b6a)
Bug 修复
- 修复了
onForgotton
调度中的顺序问题,例如,这可能会导致一次性效果的onDispose
以错误的顺序执行。(Ic1c91、b/417450712) - 修复了可暂停组合中状态处理的重用问题(Ife96e、b/404058957)
- 一个小的错误修复,使可变集合检测兼容
K1
和K2
(Ie4878) - 一个小的错误修复,使重写属性访问器上的注解查找兼容
K1
和K2
(I9900d)
外部贡献
- 修复了影响
Molecule
用户的一个错误,即使用RecompositionMode.Immediate
可能会导致重新组合丢失。(I9f3a9、b/419527812) - 公开了
PausableComposition
的isApplied
和isCancelled
getter
,允许检查PausableComposition
的状态。(I994aa)
版本 1.9.0-alpha03
2025 年 5 月 20 日
androidx.compose.runtime:runtime-*:1.9.0-alpha03
已发布。版本 1.9.0-alpha03 包含这些提交。
API 变更
- 将
setDiagnosticStackTraceEnabled
更改为实验性,以考虑此功能的未来开发。(I11db3)
Bug 修复
- 修复了当组合暂停并重新启动时,但一些之前暂停的状态需要重新组合(因为其读取的一些状态在组合暂停期间发生了变化)时的状态重用问题。(I441d1、b/416209738)
- 完成了可暂停组合
remember
调度修复(针对问题b/404058957
,之前的修复不完整)。(I1afd4、b/404058957) SaveableStateHolder.SaveableStateProvider
现在通过组合向其内容提供了LocalSavedStateRegistryOwner
。(Ia2761、b/413108878)androidx.compose.runtime.saveable
现在依赖于androidx.lifecycle.runtime.compose
。(I53228、b/413108878)
版本 1.9.0-alpha02
2025 年 5 月 7 日
androidx.compose.runtime:runtime-*:1.9.0-alpha02
已发布。版本 1.9.0-alpha02 包含这些提交。
API 变更
- 已弃用带有自定义 'key' 的
rememberSaveable
。它绕过了位置作用域,导致状态错误和不一致的行为(例如,意外的状态共享或丢失,嵌套LazyLayouts
中的问题)。请删除 'key' 参数以使用位置作用域,从而实现一致的局部作用域状态。有关更多详细信息,请参阅完整的提交消息。(I5e6ff、b/357685851)
Bug 修复
OffsetApplier
现在正确覆盖了随可暂停组合引入的apply()
方法。缺少此方法可能导致可暂停组合在更新虚拟节点时抛出异常。(Idbf31、b/409291131)- 修复了可能影响
Molecule
用户的死锁问题,即当FrameClock.withFrameNanos
的挂起调用在帧被调度时被取消时。(I89cab、b/407027032) - 当可移动内容状态仍待丢弃时,
Recomposer
可能会进入空闲状态。这通常不会发生,因为可移动内容状态在Recomposer
的主循环中被丢弃。但是,在可暂停组合中,当可移动内容在resume()
期间被丢弃时,可能会发生这种情况。(Ie5416、b/409267170) - 在可暂停组合期间,
onReuse
和onDeactivate
的顺序可能会颠倒。现在保证它们按照onDeactivate/onReuse
的顺序发生。(I996e4、b/404058957)
版本 1.9.0-alpha01
2025 年 4 月 23 日
androidx.compose.runtime:runtime-*:1.9.0-alpha01
已发布。版本 1.9.0-alpha01 包含这些提交。
行为变更
- Compose 附带的
Lint
检查现在需要最低AGP
版本8.8.2
。如果您无法升级AGP
,则可以通过在gradle.properties
中使用android.experimental.lint.version=8.8.2
(或更高版本)来单独升级Lint
。要在IDE
中运行 Composelint
检查,需要Android Studio Ladybug
或更高版本。
API 变更
currentCompositeKeyHash
现已弃用。请改用currentCompositeKeyHashCode
。替换 API 使用更多位编码相同的哈希,这指数级地降低了组合层次结构中两个随机不相关组具有相同哈希键的几率。(I4cb6a、b/177562901)- 使用
Kotlin 2.0
发布的项目需要使用KGP 2.0.0
或更高版本(Idb6b5) @Stable
、@Immutable
和@StableMarker
已移动到runtime-annotation
(以兼容方式)。如果您想从不依赖Compose
的库中使用这些注解,现在可以依赖runtime-annotation
。(I23a16)- 删除了
onCreating
和onDisposing
,因为它们已被弃用并重命名为onPreCreate
和onPreDispose
。此更改完成了重命名。(I97461) - 公开一个组合局部变量,允许根据组合中 Compose 节点的位置附加 Compose 堆栈跟踪。(Ie0bda、b/354163858)
- 引入基于组合中存储的源信息的诊断性 Compose 堆栈跟踪。(I3db9f、b/354163858)
- 弃用
runWithTimingDisabled
,转而使用runWithMeasurementDisabled
,后者更清晰地描述了行为 - 所有指标均暂停。此外,公开MicrobenchmarkScope
超类,因为重新声明runWithMeasurementDisabled
函数以开放访问是不可能的,因为它是一个内联函数。(I9e23b、b/389149423、b/149979716) - 添加了
@FrequentlyChangingValue
:一个可标记函数和属性getter
的注解,用于指示它们不应在组合内部直接调用,因为这可能导致频繁的重新组合。例如,用于标记滚动位置值和动画值。相应的lint
检查会提供警告。(I83630、b/234042500) - 添加了
@RememberInComposition
:一个可标记构造函数、函数和属性getter
的注解,用于指示它们不得在组合内部直接调用,除非它们已被记住。相应的lint
检查将引发错误。此注解可用于标记返回有状态/可变对象、其身份在组合中保持重要性的对象,或实例化成本高昂且应在组合中缓存的对象。(Ie7db0) - 添加了一个新的
rememberSaveable
重载,支持使用KotlinX Serialization
进行类型安全状态持久化的KSerializer
。现有的基于Saver
的API
仍然受支持。(Iea4ab、b/376028110)
Bug 修复
- 修复了可暂停组合中
remember
观察器的调度,以避免在同一apply
中调度已记住/已忘记的。(I570b2、b/404645679、b/407931790) - 将
SnapshotObserver
方法onCreating
重命名为onPreCreate
,将onDisposing
重命名为onPreDispose
,以符合API
指南。之前的方法已弃用,新方法默认调用旧方法,因此此接口的现有实现将继续工作,直到方法被删除。这些方法将在1.9.0 alpha
版本中随后的一个CL
中删除。它们将在1.8
稳定版之前从1.8 beta
版中删除。(I6d753) - 修复了一个问题,即当重新组合出现在可移动组之后的省略组时,记住的值可能会被错误地遗忘并重新计算。(I62cab、b/383769314)
- 在
LaunchedEffect
和rememberCoroutineScope
中添加了对 Compose 堆栈跟踪的支持(I705c0、b/354163858) - Compose
lint
检查现在需要命令行中AGP
的最低版本为8.8.2
,以及IDE
支持至少为Android Studio Ladybug
。如果您使用的是旧版AGP
,则可以在gradle.properties
中设置android.experimental.lint.version=8.8.2
以升级Lint
版本,而不会影响AGP
。(I6f2a8)
外部贡献
- 将
AnnotationTarget.FUNCTION
添加到FunctionKeyMeta
注解中。(I08021)
版本 1.8
版本 1.8.2
2025 年 5 月 20 日
androidx.compose.runtime:runtime-*:1.8.2
已发布。版本 1.8.2 包含这些提交。
版本 1.8.1
2025 年 5 月 7 日
androidx.compose.runtime:runtime-*:1.8.1
已发布。版本 1.8.1 包含这些提交。
版本 1.8.0
2025 年 4 月 23 日
androidx.compose.runtime:runtime-*:1.8.0
已发布。版本 1.8.0 包含这些提交。
版本 1.8.0-rc03
2025 年 4 月 9 日
androidx.compose.runtime:runtime-*:1.8.0-rc03
已发布。版本 1.8.0-rc03 包含这些提交。
版本 1.8.0-rc02
2025 年 3 月 26 日
androidx.compose.runtime:runtime-*:1.8.0-rc02
已发布。版本 1.8.0-rc02 包含这些提交。
版本 1.8.0-rc01
2025 年 3 月 12 日
androidx.compose.runtime:runtime-*:1.8.0-rc01
已发布。版本 1.8.0-rc01 包含这些提交。
API 变更
- 将
SnapshotObserver
方法onCreating
重命名为onPreCreate
,将onDisposing
重命名为onPreDispose
,以符合API
指南。之前的方法已弃用,新方法默认调用旧方法,因此此接口的现有实现将继续工作,直到方法被删除。这些方法将在1.9.0 alpha
版本中随后的一个CL
中删除。它们将在1.8
稳定版之前从1.8 beta
版中删除。(I6d753)
版本 1.8.0-beta03
2025 年 2 月 26 日
androidx.compose.runtime:runtime-*:1.8.0-beta03
已发布。版本 1.8.0-beta03 包含这些提交。
版本 1.8.0-beta02
2025 年 2 月 12 日
androidx.compose.runtime:runtime-*:1.8.0-beta02
已发布。版本 1.8.0-beta02 包含这些提交。
Bug 修复
- 在可暂停组合中重新抛出捕获的异常。(384486d)
版本 1.8.0-beta01
2025 年 1 月 29 日
androidx.compose.runtime:runtime-*:1.8.0-beta01
已发布。版本 1.8.0-beta01 包含这些提交。
API 变更
- 修复了在组合期间抛出不继承自
Exception
的可抛出对象可能导致“待处理组合未应用”错误的问题。(I356be、b/382094412)
版本 1.8.0-alpha08
2025 年 1 月 15 日
androidx.compose.runtime:runtime-*:1.8.0-alpha08
已发布。版本 1.8.0-alpha08 包含这些提交。
版本 1.8.0-alpha07
2024 年 12 月 11 日
androidx.compose.runtime:runtime-*:1.8.0-alpha07
已发布。版本 1.8.0-alpha07 包含这些提交。
API 变更
- 添加了工具
API
,帮助布局检查器在未通过节点连接子组合到父组合的情况下,将子组合与父组合关联起来。(I4ce3d) - 将
SnapshotId
的算术和特殊常量设为内部而非公共。如有必要,可以通过分别使用toInt()
或toLong()
将SnasphotId
转换为Int
或Long
来对其执行算术运算。没有原生Long
类型的平台(例如JavaScript
)应避免高帧率(超过1000 FPS
),否则大约每 24 天会导致Int
溢出。(Ic3a57)
外部贡献
- 优化
movableContentOf
参数的存储。(ed87177)
版本 1.8.0-alpha06
2024 年 11 月 13 日
androidx.compose.runtime:runtime-*:1.8.0-alpha06
已发布。版本 1.8.0-alpha06 包含这些提交。
API 变更
PausableComposition
API
的变更。这些是相对于 1.8.0-alpha 之前版本(自 1.8.0-alpha02 起)的重大变更,但由于这些是 1.8.0 中的新API
,因此未维护向后兼容性,因为这些API
仍处于alpha
阶段。(I39819)- 添加了工具
API
,用于观察Recomposer
中新组合的创建(Iaeb7e) - 将
Long
类型的snapshotId
添加到Snapshot
并弃用id
。快照ID
从Int
更改为Long
,以避免在具有非常高帧率和长时间运行动画的系统上快照ID
溢出。该类型被设置为expect/actual
,以允许在没有原生Long
类型的平台上此类型可以是Int
或其他类型。(I38ac3、b/374821679)
Bug 修复
- 修复了单个
provides
的providesDefault
。(aosp/3318540 b/374263387) - 优化
ChangeList
。(3318538)
版本 1.8.0-alpha05
2024 年 10 月 30 日
androidx.compose.runtime:runtime-*:1.8.0-alpha05
已发布。版本 1.8.0-alpha05 包含这些提交。
Bug 修复
- 修复了将
Int.MAX_VALUE
添加到SnapshotIdSet
时的堆栈溢出问题。(b/370536104、Ic4179f6) - 运行时微优化(I50c60)
- 允许
R8
删除调试runtimeCheck
调用(I8c44) - 使
compoundKeyOf
迭代而非递归(I5817f)
外部贡献
- 使用集合列表实现堆栈(I7d47c)
版本 1.8.0-alpha04
2024 年 10 月 16 日
androidx.compose.runtime:runtime-*:1.8.0-alpha04
已发布。版本 1.8.0-alpha04 包含这些提交。
性能改进
- 在构造函数中为状态记录提供快照
ID
(85c00f) - 重构
SnapshotState***
以避免类验证错误(6ee4a6) - 修复
R8
规则以防止抛出内联(5beb92) - 微优化操作(d73c5c)
- 优化
JVM
上的SynchronizedObject
分配(2b043f)
版本 1.8.0-alpha03
2024 年 10 月 2 日
androidx.compose.runtime:runtime-*:1.8.0-alpha03
已发布。版本 1.8.0-alpha03 包含这些提交。
性能改进
- 为
rememberCoroutineScope
惰性创建子上下文(f61464)rememberCoroutineScope
通常用于响应组合后发生的事件启动协程。在某些情况下,这些事件可能永远不会发生,导致增加Job
创建和取消的成本而没有任何好处。- 使
rememberCoroutineScope
返回的作用域在访问时惰性创建其coroutineContext
,如果从未用到该作用域,则完全避免Job
创建和取消。
版本 1.8.0-alpha02
2024 年 9 月 18 日
androidx.compose.runtime:runtime-*:1.8.0-alpha02
已发布。版本 1.8.0-alpha02 包含这些提交。
新功能
- 添加了
PausableComposition
,它允许创建可在组合期间暂停并异步应用于组合的子组合。暂停功能需要编译器支持,目前正在开发中。(I3394b)
版本 1.8.0-alpha01
2024 年 9 月 4 日
androidx.compose.runtime:runtime-*:1.8.0-alpha01
已发布。版本 1.8.0-alpha01 包含这些提交。
版本 1.7
版本 1.7.8
2025 年 2 月 12 日
androidx.compose.runtime:runtime-*:1.7.8
已发布。版本 1.7.8 包含这些提交。
版本 1.7.7
2025 年 1 月 29 日
androidx.compose.runtime:runtime-*:1.7.7
已发布。与 1.7.6
相比无变化。
androidx.compose.runtime:runtime-*:1.7.6
已发布。版本 1.7.6 包含这些提交。
版本 1.7.5
2024 年 10 月 30 日
androidx.compose.runtime:runtime-*:1.7.5
已发布。版本 1.7.5 包含这些提交。
版本 1.7.4
2024 年 10 月 16 日
androidx.compose.runtime:runtime-*:1.7.4
已发布。版本 1.7.4 包含这些提交。
版本 1.7.3
2024 年 10 月 2 日
androidx.compose.runtime:runtime-*:1.7.3
已发布。版本 1.7.3 包含这些提交。
版本 1.7.2
2024 年 9 月 18 日
androidx.compose.runtime:runtime-*:1.7.2
已发布。版本 1.7.2 包含这些提交。
版本 1.7.1
2024 年 9 月 10 日
- Android 构件无变化。移除了
-desktop
构件,并添加了-jvmStubs
和-linuxx64Stubs
构件。这些目标都不打算使用,它们是帮助Jetbrains Compose
工作区的占位符。
版本 1.7.0
2024 年 9 月 4 日
androidx.compose.runtime:runtime-*:1.7.0
已发布。版本 1.7.0 包含这些提交。
自 1.6.0 以来的重要变更
- 添加了提供组合局部变量的功能,该变量可以根据其他组合局部变量的值进行计算,无论是默认情况下使用
compositionLocalWithComputedDefault()
,还是通过提供lambda
来使用providesComputed
而不是provides
来计算值。 - 可以通过使用组合局部变量的
currentValue
属性(在计算值的lambda
内部可访问)来获取组合局部变量的值。这取代了只能在@Composable
函数中访问的current
。(Iadbc0) - 新创建的状态对象及其初始状态可立即从其他快照(包括全局快照)中访问。任何后续修改在创建该对象的快照应用之前不可见。
mutableStateOf()
及其原始版本的初始状态是作为参数传递给mutableStateOf()
的值。mutableStateListOf()
和mutableStateMapOf()
的初始状态为空。- 添加了
Snapshot.isInSnapshot
和Snapshot.PreexistingSnapshotId
,用于使状态对象支持在创建后立即从全局快照访问。 - 自定义状态对象可以通过遵循内置快照对象所做的更改模式来支持立即访问。(I84a17)
- 为 Compose 库启用
nonSkippingGroupOptimization
。这使得androidx
中所有不可重启的可组合函数的生成代码更高效。未来我们计划默认启用此功能。I(acbc08) - 在同一帧中使子组合中的可组合
lambda
失效。(98301c) - 按照与
onForgotten
相同的顺序调用onRelease
回调。(2cd790) - 启用强跳过模式(ed1766)
- 在更多情况下使
currentCompoundHashKey
唯一(d4a872)
版本 1.7.0-rc01
2024 年 8 月 21 日
androidx.compose.runtime:runtime-*:1.7.0-rc01
已发布。版本 1.7.0-rc01 包含这些提交。
版本 1.7.0-beta07
2024 年 8 月 7 日
androidx.compose.runtime:runtime-*:1.7.0-beta07
已发布。版本 1.7.0-beta07 包含这些提交。
版本 1.7.0-beta06
2024 年 7 月 24 日
androidx.compose.runtime:runtime-*:1.7.0-beta06
已发布。版本 1.7.0-beta06 包含这些提交。
版本 1.7.0-beta05
2024 年 7 月 10 日
androidx.compose.runtime:runtime-*:1.7.0-beta05
已发布。版本 1.7.0-beta05 包含这些提交。
版本 1.7.0-beta04
2024 年 6 月 26 日
androidx.compose.runtime:runtime-*:1.7.0-beta04
已发布。版本 1.7.0-beta04 包含这些提交。
版本 1.7.0-beta03
2024 年 6 月 12 日
androidx.compose.runtime:runtime-*:1.7.0-beta03
已发布。版本 1.7.0-beta03 包含这些提交。
版本 1.7.0-beta02
2024 年 5 月 29 日
androidx.compose.runtime:runtime-*:1.7.0-beta02
已发布。版本 1.7.0-beta02 包含这些提交。
版本 1.7.0-beta01
2024 年 5 月 14 日
androidx.compose.runtime:runtime-*:1.7.0-beta01
已发布。版本 1.7.0-beta01 包含这些提交。
版本 1.7.0-alpha08
2024 年 5 月 1 日
androidx.compose.runtime:runtime-*:1.7.0-alpha08
已发布。版本 1.7.0-alpha08 包含这些提交。
版本 1.7.0-alpha07
2024 年 4 月 17 日
androidx.compose.runtime:runtime-*:1.7.0-alpha07
已发布。版本 1.7.0-alpha07 包含这些提交。
新功能
- 添加了提供组合局部变量的功能,该变量可以根据其他组合局部变量的值进行计算,无论是默认情况下使用
compositionLocalWithComputedDefault()
,还是通过提供lambda
来使用providesComputed
而不是provides
来计算值。 - 可以通过使用组合局部变量的
currentValue
属性(在计算值的lambda
内部可访问)来获取组合局部变量的值。这取代了只能在@Composable
函数中访问的current
。(Iadbc0)
API 变更
- 新创建的状态对象及其初始状态可立即从其他快照(包括全局快照)中访问。任何后续修改在创建该对象的快照应用之前不可见。
mutableStateOf()
及其原始版本的初始状态是作为参数传递给mutableStateOf()
的值。mutableStateListOf()
和mutableStateMapOf()
的初始状态为空。- 添加了
Snapshot.isInSnapshot
和Snapshot.PreexistingSnapshotId
,用于使状态对象支持在创建后立即从全局快照访问。 - 自定义状态对象可以通过遵循内置快照对象所做的更改模式来支持立即访问。(I84a17)
Bug 修复
- 修复了嵌套快照中
readObserver
的合并问题。这导致嵌套的派生状态在snapshotFlow
内部使用时出现欠失效。(Idf138)
版本 1.7.0-alpha06
2024 年 4 月 3 日
androidx.compose.runtime:runtime-*:1.7.0-alpha06
已发布。版本 1.7.0-alpha06 包含这些提交。
Bug 修复
版本 1.7.0-alpha05
2024 年 3 月 20 日
androidx.compose.runtime:runtime-*:1.7.0-alpha05
已发布。版本 1.7.0-alpha05 包含这些提交。
Bug 修复
- 清除已停用组合中的后期更改(5950bc)
版本 1.7.0-alpha04
2024 年 3 月 6 日
androidx.compose.runtime:runtime-*:1.7.0-alpha04
已发布。版本 1.7.0-alpha04 包含这些提交。
性能改进
- 每个派生状态评估调用
Snapshot.current
一次(ee7daf) - 组合中每次观察读取
currentRecord
一次(b882b2) - 移除
snapshotFlow
中意外的迭代器分配(231e56) - 为 Compose 库启用
nonSkippingGroupOptimization
。这使得androidx
中所有不可重启的可组合函数的生成代码更高效。未来我们计划默认启用此功能。I(acbc08)
版本 1.7.0-alpha03
2024 年 2 月 21 日
androidx.compose.runtime:runtime-*:1.7.0-alpha03
已发布。版本 1.7.0-alpha03 包含这些提交。
API 变更
- 引入替换组以改进变更检测(0941b5)
性能改进
- 改进变更检测时的内存分配(53e7fd)
- 修复组合器中的内存泄漏(0e097d)
- 重新组合时使用
ScopeMap
传递失效(e19a7e) - 优化失效映射以仅保留派生状态(f11c44)
- 将
IdentityArraySet
用法替换为ScatterSet
(db572e) - 优化
ScopeMap
中的removeScope
(bb0530)
版本 1.7.0-alpha02
2024 年 2 月 7 日
androidx.compose.runtime:runtime-*:1.7.0-alpha02
已发布。版本 1.7.0-alpha02 包含这些提交。
Bug 修复
- 在同一帧中使子组合中的可组合
lambda
失效。(98301c) - 按照与
onForgotten
相同的顺序调用onRelease
回调。(2cd790) - 过滤
snapshotFlow
中未观察到的已更改状态。(796b80)
性能改进
- 当快照观察器已透明时,原地修改它。(f60f30)
- 优化
SnapshotIdSet.lowest()
。(7ae149) - 在
SnapshotIdSet
中使用无分配的fold()
。(532b7d) - 移除迭代器分配(83f96b)
版本 1.7.0-alpha01
2024 年 1 月 24 日
androidx.compose.runtime:runtime-*:1.7.0-alpha01
已发布。版本 1.7.0-alpha01 包含这些提交。
性能优化
Bug 修复
版本 1.6
版本 1.6.8
2024 年 6 月 12 日
androidx.compose.runtime:runtime-*:1.6.8
已发布。版本 1.6.8 包含这些提交。
版本 1.6.7
2024 年 5 月 1 日
androidx.compose.runtime:runtime-*:1.6.7
已发布。版本 1.6.7 包含这些提交。
版本 1.6.6
2024 年 4 月 17 日
androidx.compose.runtime:runtime-*:1.6.6
已发布。自上次发布以来无变化。
版本 1.6.5
2024 年 4 月 3 日
androidx.compose.runtime:runtime-*:1.6.5
已发布。版本 1.6.5 包含这些提交。
版本 1.6.4
2024 年 3 月 20 日
androidx.compose.runtime:runtime-*:1.6.4
已发布。版本 1.6.4 包含这些提交。
版本 1.6.3
2024 年 3 月 6 日
androidx.compose.runtime:runtime-*:1.6.3
已发布。版本 1.6.3 包含这些提交。
版本 1.6.2
2024 年 2 月 21 日
androidx.compose.runtime:runtime-*:1.6.2
已发布。版本 1.6.2 包含这些提交。
版本 1.6.1
2024 年 2 月 7 日
androidx.compose.runtime:runtime-*:1.6.1
已发布。版本 1.6.1 包含这些提交。
Bug 修复
版本 1.6.0
2024 年 1 月 24 日
androidx.compose.runtime:runtime-*:1.6.0
已发布。版本 1.6.0 包含这些提交。
自 1.5.0 以来的重要变更
新功能
- 重新抛出在重新组合循环中被吞噬的异常(4dff9a)
性能优化
Bug 修复
- 修复槽位表内存泄漏(73fcfe)
- 跳过将要删除的子组合的重新组合。(Ieeb99、b/254645321)
- 仅当
RememberObserver
存储在remember
计算中时才触发其生命周期。(f6b4dc) - 将
$dirty
捕获限制为内联lambda
。(acfca0) - 修复可移动内容有时接收到错误组合局部变量的问题。(035cd6)
版本 1.6.0-rc01
2024 年 1 月 10 日
androidx.compose.runtime:runtime-*:1.6.0-rc01
已发布。版本 1.6.0-rc01 包含这些提交。
版本 1.6.0-beta03
2023 年 12 月 13 日
androidx.compose.runtime:runtime-*:1.6.0-beta03
已发布。版本 1.6.0-beta03 包含这些提交。
版本 1.6.0-beta02
2023 年 11 月 29 日
androidx.compose.runtime:runtime-*:1.6.0-beta02
已发布。版本 1.6.0-beta02 包含这些提交。
版本 1.6.0-beta01
2023 年 11 月 15 日
androidx.compose.runtime:runtime-*:1.6.0-beta01
已发布。版本 1.6.0-beta01 包含这些提交。
API 变更
- 在注解中传播某些稳定性值。(274a4c)
Bug 修复
- 在上下文中对组合局部作用域状态使用引用策略。(83361c)
- 将
$dirty
捕获限制为内联lambda
。(acfca0) - 修复可移动内容有时接收到错误组合局部变量的问题。(035cd6)
- 在
RecomposeScopeImpl
中使用更快的无分配哈希映射。(d79494) - 在
DerivedState
中使用ObjectIntMap
。(21862e) - 在
DerivedState
中对 intSnapshotThreadLocal
使用IntRef
。(04eaf4)
版本 1.6.0-alpha08
2023 年 10 月 18 日
androidx.compose.runtime:runtime-*:1.6.0-alpha08
已发布。版本 1.6.0-alpha08 包含这些提交。
Bug 修复
- 仅当
RememberObserver
存储在remember
计算中时才触发其生命周期。(f6b4dc) - 改进失效列表排序中的分配。(954d63)
- 在
SnapshotStateObserver
中使用新的无分配映射。(4303ce) - 停用组合时清除失效。(e001be)
版本 1.6.0-alpha07
2023 年 10 月 4 日
androidx.compose.runtime:runtime-*:1.6.0-alpha07
已发布。版本 1.6.0-alpha07 包含这些提交。
API 变更
SnapshotStateList
现在被标记为RandomAccess
,以允许使用列表助手的直接索引版本。(I5210c、b/219554654)
版本 1.6.0-alpha06
2023 年 9 月 20 日
androidx.compose.runtime:runtime-*:1.6.0-alpha06
已发布。版本 1.6.0-alpha06 包含这些提交。
版本 1.6.0-alpha05
2023 年 9 月 6 日
androidx.compose.runtime:runtime-*:1.6.0-alpha05
已发布。版本 1.6.0-alpha05 包含这些提交。
版本 1.6.0-alpha04
2023 年 8 月 23 日
androidx.compose.runtime:runtime-*:1.6.0-alpha04
已发布。版本 1.6.0-alpha04 包含这些提交。
新功能
- 重新抛出在重新组合循环中被吞噬的异常(4dff9a)
API 变更
- 添加了一个方法来停用
ReusableComposition
,它会移除观察,但保留节点。可以通过调用setContent
再次激活已停用的组合。(Ib7f31) - 添加
ReusableComposition
接口,用于管理子组合的生命周期和重用。(I812d1、b/252846775)
版本 1.6.0-alpha03
2023 年 8 月 9 日
androidx.compose.runtime:runtime-*:1.6.0-alpha03
已发布。版本 1.6.0-alpha03 包含这些提交。
Bug 修复
版本 1.6.0-alpha02
2023 年 7 月 26 日
androidx.compose.runtime:runtime-*:1.6.0-alpha02
已发布。版本 1.6.0-alpha02 包含这些提交。
新功能和性能增强
- 优化
rememberSaveable
(f01d79) - 将派生状态的重新读取推迟到更改记录后(f38099)
- 改进提供组合局部变量值的方式(a337ea)
SideEffect
被标记为@ExplicitGroupsComposable
,以避免生成组。(I74815)- 在重用时避免比较组合局部映射(782071)
API 变更
- 为
CompositionLocalProviders
添加了一个特殊情况的重载,该重载避免了用于加快提供多个值的开销,但在提供单个值时会产生开销。(I6d640、b/288169379)
Bug 修复
版本 1.6.0-alpha01
2023 年 6 月 21 日
androidx.compose.runtime:runtime-*:1.6.0-alpha01
已发布。版本 1.6.0-alpha01 包含这些提交。
Bug 修复
- 跳过将要删除的子组合的重新组合。(Ieeb99、b/254645321)
- 减少了应用快照时的分配。(I65c09)
- 如果快照未修改,则避免在
DerivedState
中计算readableHash
(68c565)
版本 1.5
版本 1.5.4
2023 年 10 月 18 日
androidx.compose.runtime:runtime-*:1.5.4
已发布。版本 1.5.4 包含这些提交。
版本 1.5.3
2023 年 10 月 4 日
androidx.compose.runtime:runtime-*:1.5.3
已发布。版本 1.5.3 包含这些提交。
版本 1.5.2
2023 年 9 月 27 日
androidx.compose.runtime:runtime-*:1.5.2
已发布。版本 1.5.2 包含这些提交。
版本 1.5.1
2023 年 9 月 6 日
androidx.compose.runtime:runtime-*:1.5.1
已发布。版本 1.5.1 包含这些提交。
版本 1.5.0
2023 年 8 月 9 日
androidx.compose.runtime:runtime-*:1.5.0
已发布。版本 1.5.0 包含这些提交。
API 变更
- 移除了重新组合、颜色动画和
AndroidComposeView
中的分配。(Ib2bfa) - 添加了
@StateFactoryMarker
注解,用于标记创建状态且必须封装在remember
调用中的函数。(I64550) - 添加
State
和MutableState
的原始版本(fb3d89) - 添加了
Snapshot.isApplyObserverNotificationPending
(I672a5) - 添加了
State API
的原始版本,允许在State
对象中跟踪Int
、Long
、Float
和Double
值,而不会因自动装箱而产生性能损失。请使用新的工厂方法mutableIntState(Int)
、mutableFloatStateOf(Float)
等来使用这些功能。(I48e43)
Bug 修复
- 跳过将要删除的子组合的重新组合。(Ieeb99、b/254645321)
- 不在
ComposerImpl
中保留快照引用(0206f7) - 不要两次应用组合(f5791b)
- 确保未初始化的派生状态值失效(aa2a92)
- 在组合处理期间调用
onEndChanges
。(62cc8c) - 修复将内容移动到子组合的问题(4beb41)
- 修复潜在死锁(c1a425 和 8edce0)
- 为 Android 窗口创建的重新组合器现在只会在收到
ON_STOP
通知时阻止对withFrameNanos
的调用,而不是阻止所有组合。这意味着与已停止活动关联的窗口将继续对数据更改进行重新组合,但动画或withFrameNanos
的任何其他调用者将被阻止。(Id9e7f、b/240975572) - 在处理效果之前为
LayoutNode
执行停用回调 3784073 - 修复重新启动的
lambda
的更改标志 ea81df9 - 修复带有节点的
Composable
的实时编辑回归问题 73fd4d8 ON_STOP
应暂停帧时钟广播而不是组合 ae276f1- 使
SnapshotStateObserver
作用域对未更改的派生状态失效 84d9b1c - 修复处理组合时潜在的死锁 28761fc
- 修复将内容移动到子组合的问题 92d4156
- 修复重新启动的
lambda
的更改标志(8a03e9) - 在处理效果之前为
LayoutNode
执行停用回调(8b0fa4) - 修复结束节点组时
endToMarker()
的问题。(d71d980) - 停用时使用当前
SlotWriter
组进行检查(a0b518b) - 移除
SlotTable.moveSlotGapTo()
中的填充并将其移到关闭处(81f9935) - 修复可移动内容移动时缺失的失效问题(1d7c024)
- 修复移动的可移动内容的即时失效问题(8676618)
性能改进
- 如果快照未修改,则避免在
DerivedState
中计算readableHash
。(307102) - 减少了分配(I65c09、d7ea77、727974 和 445808)
- 快速取消 Compose
CoroutineScopes
(a55362 和 bd382f) - 使用不可访问的状态记录覆盖状态对象的记录(c986960)
- 实现组时使用正确作用域的组合器(9a5e5b6)
- 使用
IdentityArraySet
存储快照失效(7f60cca) - 减少快照观察的分配(5bc535f)
版本 1.5.0-rc01
2023 年 7 月 26 日
androidx.compose.runtime:runtime-*:1.5.0-rc01
已发布。版本 1.5.0-rc01 包含这些提交。
Bug 修复
将派生状态的重新读取推迟到更改记录后(f38099)
现有一个可选检查,建议将
mutableStateOf()
调用迁移到其对应的基元专用类型。其lint ID
为AutoboxingStateCreation
。以前,此检查默认对所有项目启用。要在Android Studio
编辑器和项目lint
输出中看到此警告,请通过在模块的build.gradle
或build.gradle.kts
配置中声明warning "AutoboxingStateCreation"
来将其严重性从信息更改为警告(或更高),如所示(I34f7e)android { lint { warning "AutoboxingStateCreation" } ... }
版本 1.5.0-beta03
2023 年 6 月 28 日
androidx.compose.runtime:runtime-*:1.5.0-beta03
已发布。版本 1.5.0-beta03 包含这些提交。
Bug 修复
- 跳过将要删除的子组合的重新组合。(Ieeb99、b/254645321)
版本 1.5.0-beta02
2023 年 6 月 7 日
androidx.compose.runtime:runtime-*:1.5.0-beta02
已发布。版本 1.5.0-beta02 包含这些提交。
性能改进
- 如果快照未修改,则避免在
DerivedState
中计算readableHash
。(307102)
版本 1.5.0-beta01
2023 年 5 月 24 日
androidx.compose.runtime:runtime-*:1.5.0-beta01
发布。版本 1.5.0-beta01 包含以下提交。
API 变更
- 在重新组合、颜色动画和
AndroidComposeView
中移除了分配 (Ib2bfa) - 添加了
@StateFactoryMarker
注解,用于标记创建状态且必须封装在remember
调用中的函数。(I64550) - 添加
State
和MutableState
的原始版本(fb3d89) - 添加了
Snapshot.isApplyObserverNotificationPending
(I672a5)
Bug 修复
- 减少了分配(I65c09、d7ea77、727974 和 445808)
- 不在
ComposerImpl
中保留快照引用(0206f7) - 快速取消 Compose
CoroutineScopes
(a55362 和 bd382f) - 不要两次应用组合(f5791b)
- 确保未初始化的派生状态值失效(aa2a92)
- 在组合处理期间调用
onEndChanges
。(62cc8c) - 修复将内容移动到子组合的问题(4beb41)
- 修复潜在的死锁 (c1a425)
- ON_STOP 应暂停帧时钟广播而不是组合 (f4a2d1)
- 修复重新启动的
lambda
的更改标志(8a03e9) - 在处理效果之前为
LayoutNode
执行停用回调(8b0fa4)
外部贡献
- 添加了
Snapshot.isApplyObserverNotificationPending
(I672a5)
版本 1.5.0-alpha04
2023 年 5 月 10 日
androidx.compose.runtime:runtime-*:1.5.0-alpha04
发布。版本 1.5.0-alpha04 包含以下提交。
API 变更
- 添加了
State API
的原始版本,允许在State
对象中跟踪Int
、Long
、Float
和Double
值,而不会因自动装箱而产生性能损失。请使用新的工厂方法mutableIntState(Int)
、mutableFloatStateOf(Float)
等来使用这些功能。(I48e43)
Bug 修复
在组合处置期间调用
onEndChanges
。在Composition.dispose
期间移除的焦点节点正在订阅onEndChanges
以重置焦点。( 03d4a47)确保未初始化派生状态值的失效。每个派生状态都与
SnapshotStateObserver
中其依赖项的列表相关联,用于在依赖项更改时使与派生状态相关的范围失效。依赖项更改在快照前进时注册,这可能发生在派生状态读取之后(由于调用Snapshot.notifyObjectsInitialized()
)。SnapshotStateObserver
中先前的派生状态观察逻辑正在清理旧依赖项,然后读取新值。这导致了失效发生在已清理状态下的竞争条件,其中依赖项失效未注册。此更改重新排序了派生状态读取和依赖项清理,确保失效始终发生在有效状态下。( c472be6)
版本 1.5.0-alpha03
2023 年 4 月 19 日
androidx.compose.runtime:runtime-*:1.5.0-alpha03
发布。版本 1.5.0-alpha03 包含以下提交。
API 变更
- 为 Android 窗口创建的重新组合器现在只会在收到
ON_STOP
通知时阻止对withFrameNanos
的调用,而不是阻止所有组合。这意味着与已停止活动关联的窗口将继续对数据更改进行重新组合,但动画或withFrameNanos
的任何其他调用者将被阻止。(Id9e7f、b/240975572)
Bug 修复
- 修复快照列表和映射中潜在的死锁 5c1a425
- 在处理效果之前为
LayoutNode
执行停用回调 3784073 - 修复重新启动的
lambda
的更改标志 ea81df9 - 修复带有节点的
Composable
的实时编辑回归问题 73fd4d8 ON_STOP
应暂停帧时钟广播而不是组合 ae276f1- 使
SnapshotStateObserver
作用域对未更改的派生状态失效 84d9b1c - 修复处理组合时潜在的死锁 28761fc
- 修复将内容移动到子组合的问题 92d4156
版本 1.5.0-alpha02
2023 年 4 月 5 日
androidx.compose.runtime:runtime-*:1.5.0-alpha02
发布。版本 1.5.0-alpha02 包含以下提交。
新功能
- Kotlin 的
getValue
运算符现在可以组合 (f174f6e)
错误修复、性能改进
- 使用不可访问的状态记录覆盖状态对象的记录(c986960)
- 实现组时使用正确作用域的组合器(9a5e5b6)
- 修复结束节点组时
endToMarker()
的问题。(d71d980) - 停用时使用当前
SlotWriter
组进行检查(a0b518b) - 使用
IdentityArraySet
存储快照失效(7f60cca) - 移除
SlotTable.moveSlotGapTo()
中的填充并将其移到关闭处(81f9935) - 修复可移动内容移动时缺失的失效问题(1d7c024)
- 修复移动的可移动内容的即时失效问题(8676618)
- 减少快照观察的分配(5bc535f)
版本 1.5.0-alpha01
2023 年 3 月 22 日
androidx.compose.runtime:runtime-*:1.5.0-alpha01
发布。版本 1.5.0-alpha01 包含以下提交。
新功能
- 添加
Modifier.Node#coroutineScope
以允许Modifier.Nodes
启动协程 (I76ef9) - 允许
Modifier.Nodes
通过实现CompositionLocalConsumerModifierNode
接口来读取CompositionLocals
。( Ib44df)
版本 1.4
版本 1.4.3
2023 年 5 月 3 日
androidx.compose.runtime:runtime-*:1.4.3
发布,无更改。
版本 1.4.2
2023 年 4 月 19 日
androidx.compose.runtime:runtime-*:1.4.2
发布。版本 1.4.2 包含以下提交。
Bug 修复
修复快照列表和映射中潜在的死锁 2eb6570
如果对状态记录进行并发直接写入,将内容添加到
SnapshotStateList
或SnapshotStateMap
可能会遇到死锁。由于 93fcae828b 引入的更改使用直接写入来释放未使用的记录,这种情况变得更加可能发生。现在锁的顺序是,当持有映射或列表锁时,永远不会尝试获取快照锁。
版本 1.4.1
2023 年 4 月 5 日
androidx.compose.runtime:runtime-*:1.4.1
发布。版本 1.4.1 包含以下提交。
Bug 修复
- 修复结束节点组时的
endToMarker()
。d71d980
版本 1.4.0
2023 年 3 月 22 日
androidx.compose.runtime:runtime-*:1.4.0
发布。版本 1.4.0 包含以下提交。
自 1.3.0 以来重要更改
- 使用
LiveData
中的初始化值进行首次组合 3680e25 - 添加
ComposeNodeLifecycleCallback
以观察组合节点的生命周期。8b6a258 - 添加
parameterTypes
属性到ComposableMethod
7b6c7ad
错误修复和性能改进
- 清除
SnapshotStateObserver
中的两个作用域索引 29f4a3e - 在不可跳过 Lambda 的主体中添加所需的组 7d06752
- 改进快照状态的内存引用特性 93fcae8
- 在组合局部查找中移除装箱 0875717
- 为不可重用节点组使用正确的键 6388d8d
- 保护
SnapshotStateObserver
免受递归和并发应用的影响 98cb6ba - 在
IdentityArraySet
"get" 方法中添加了检查索引边界的检查 35a77d3 - 更新 Compose 模块以使用
ViewTreeLifecycleOwner
扩展 21c2122 - 在 Recomposer 完成帧后发送应用通知。98f2641
- 修复取消 Recomposer 时索引越界崩溃的问题 8f8656f
- 如果 Composition 的父级提供者已更改,始终强制重新组合 9526fcc
- Recomposer 对已取消 Job 的容忍度 a55f7ed
- 改进对大量组合器的失效处理 9b7ed67
- 修复为非本地返回生成结束组的问题 b6f590c
版本 1.4.0-rc01
2023 年 3 月 8 日
androidx.compose.runtime:runtime-*:1.4.0-rc01
发布。版本 1.4.0-rc01 包含以下提交。
Bug 修复
版本 1.4.0-beta02
2023 年 2 月 22 日
androidx.compose.runtime:runtime:1.4.0-beta02
和 androidx.compose.runtime:runtime-saveable:1.4.0-beta02
发布。版本 1.4.0-beta02 包含以下提交。
版本 1.4.0-beta01
2023 年 2 月 8 日
androidx.compose.runtime:runtime-*:1.4.0-beta01
发布。版本 1.4.0-beta01 包含以下提交。
API 变更
- 添加了
ComposeNodeLifecycleCallback
,允许观察 Compose 节点的生命周期 (I3731b) - 为
Composer.disableSourceInformation()
添加了@TestOnly
,因为此函数只能在测试中安全调用。( I896c8)
Bug 修复
版本 1.4.0-alpha05
2023 年 1 月 25 日
androidx.compose.runtime:runtime:1.4.0-alpha05
和 androidx.compose.runtime:runtime-saveable:1.4.0-alpha05
发布。版本 1.4.0-alpha05 包含以下提交。
API 变更
- 内联/已弃用-隐藏函数的更多类型/可空性 (I24f91)
版本 1.4.0-alpha04
2023 年 1 月 11 日
androidx.compose.runtime:runtime-*:1.4.0-alpha04
发布。版本 1.4.0-alpha04 包含以下提交。
API 变更
TestMonotonicFrameClock
现在使用正确的实验性注解。( I95c9e)
Bug 修复
- 保护
SnapshotStateObserver
免受递归和并发应用的影响 (d902fb)
版本 1.4.0-alpha03
2022 年 12 月 7 日
androidx.compose.runtime:runtime-*:1.4.0-alpha03
发布。版本 1.4.0-alpha03 包含以下提交。
API 变更
- 为
ComposableMethod
类添加了一个新的公共方法,类似于java.lang.reflect.Method#getParameterTypes()
(Iab0c3)
Bug 修复
- 快照应用通知现在在
Recomposer
完成应用更改后发送。( Iad6c0, b/222093277)
版本 1.4.0-alpha02
2022 年 11 月 9 日
androidx.compose.runtime:runtime-*:1.4.0-alpha02
发布。版本 1.4.0-alpha02 包含以下提交。
版本 1.4.0-alpha01
2022 年 10 月 24 日
androidx.compose.runtime:runtime-*:1.4.0-alpha01
发布。版本 1.4.0-alpha01 包含以下提交。
API 变更
SnapshotStateList
和SnapshotStateMap
现在分别具有toList()
和toMap()
的显式实现。这些方法返回其当前内容而无需执行复制,因为它们返回用于存储其内容的内部不可变数据。此值可用于(例如)使用snapshotFlow
生成值流,而无需复制数据。( Ica2bd)
版本 1.3
版本 1.3.3
2023 年 1 月 11 日
androidx.compose.runtime:runtime-*:1.3.3
发布。版本 1.3.3 包含以下提交。
- 自 1.3.2 以来无更改
版本 1.3.2
2022 年 12 月 7 日
androidx.compose.runtime:runtime-*:1.3.2
发布。版本 1.3.2 包含以下提交。
Bug 修复
- 更新以支持 androidx.compose.ui 1.3.2
版本 1.3.1
2022 年 11 月 9 日
androidx.compose.runtime:runtime-*:1.3.1
发布。版本 1.3.1 包含以下提交。
版本 1.3.0
2022 年 10 月 24 日
androidx.compose.runtime:runtime-*:1.3.0
发布。版本 1.3.0 包含以下提交。
自 1.2.0 以来重要更改
异常处理 / 实时编辑支持
- 为了更好地支持实时编辑,添加了 API 以实现在组合期间处理异常
- 用于热重载的组合错误处理
- 在保存/恢复时处理实时编辑错误
组合追踪
- 添加了运行时追踪 API 以支持新的组合追踪工具
- 生成可组合追踪事件的开始/结束调用
- 重新添加 ComposerKt.traceEventStart(Int, String)
可组合反射 API
- 添加了新的
ComposableMethod
API,以允许更可靠地基于反射调用可组合 API。 - 将 invokeComposable 移至 compose runtime
- 重做 API 以调用可组合方法
运行时修复
快照系统
- 快照系统在内存管理、性能和正确性方面进行了各种改进。
- 优化 SnapshotStateObserver 中的作用域移除
- 处置由透明快照创建的嵌套快照
- 修复从全局快照读取状态时的竞争条件
- 在 SnapshotStateObserver 中支持 DerivedState
- 当派生状态在其他作用域中读取时,阻止从组合中移除它
- 在 DerivedState 内部使用 IdentityArrayMap 而不是 HashMap
- 更新派生状态观察器以使用可变向量
- 更新 SnapshotStateObserver 状态清理
- 将 SnapshotStateObserver.invalidated 替换为 ArraySet
- 修复从全局快照读取状态时的竞争条件
- 修复派生状态哈希计算中使用陈旧记录的问题
- 修复推进全局快照时的竞争条件
- 加快 SnapshotStateObserver 中的作用域观察清理
版本 1.3.0-rc01
2022 年 10 月 5 日
androidx.compose.runtime:runtime-*:1.3.0-rc01
发布。版本 1.3.0-rc01 包含以下提交。
Bug 修复
- 修复了槽表导致的
ArrayIndexOutOfBoundsException
(b/249076084)
版本 1.3.0-beta03
2022 年 9 月 21 日
androidx.compose.runtime:runtime-*:1.3.0-beta03
发布。版本 1.3.0-beta03 包含以下提交。
行为破坏性更改
remember
和rememberCoroutineScope
的参数已更改为crossinline
。这将报告早期返回的错误,而不是允许早期返回导致稍后的内部错误。- 此更改可能会导致报告新的编译器错误,要求从传递给这些函数的 lambda 中移除非局部返回。( Ibea62)
版本 1.3.0-beta02
2022 年 9 月 7 日
androidx.compose.runtime:runtime-*:1.3.0-beta02
发布。版本 1.3.0-beta02 包含以下提交。
Bug 修复
- 更新了 API (I64ca0)
版本 1.3.0-beta01
2022 年 8 月 24 日
androidx.compose.runtime:runtime-*:1.3.0-beta01
发布。版本 1.3.0-beta01 包含以下提交。
API 变更
- 在
CompositionData
中添加了find
方法,以便使用此 API 的开发人员工具能够快速找到使用其标识的组合子组。( I5794f)
版本 1.3.0-alpha03
2022 年 8 月 10 日
androidx.compose.runtime:runtime-*:1.3.0-alpha03
发布。版本 1.3.0-alpha03 包含以下提交。
版本 1.3.0-alpha02
2022 年 7 月 27 日
androidx.compose.runtime:runtime-*:1.3.0-alpha02
发布。版本 1.3.0-alpha02 包含以下提交。
API 变更
- 为了向后兼容,重新添加了
ComposerKt.traceEventStart(Int, String)
(I6e6de)
版本 1.3.0-alpha01
2022 年 6 月 29 日
androidx.compose.runtime:runtime-*:1.3.0-alpha01
发布。版本 1.3.0-alpha01 包含以下提交。
API 变更
- 将实用功能移至运行时 (I4f729)
版本 1.2
版本 1.2.1
2022 年 8 月 10 日
androidx.compose.runtime:runtime-*:1.2.1
发布。版本 1.2.1 包含以下提交。
Bug 修复
- 修复了
androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList
中的内存泄漏:处置由透明快照创建的嵌套快照 b/239603305
版本 1.2.0
2022 年 7 月 27 日
androidx.compose.runtime:runtime-*:1.2.0
发布。版本 1.2.0 包含以下提交。
自 1.1.0
以来重要更改
Compose Runtime 在 1.2.0 中引入了一些功能,并有许多稳定的错误修复。最重要的新功能是引入了
movableContentOf
API,可用于启用共享元素转换等复杂 UX。movableContentOf
API 将可组合 lambda 转换为一个 lambda,该 lambda 会将其状态和相应的节点移动到它被调用的任何新位置。当之前的调用离开组合时,状态会暂时保留,如果对 lambda 的新调用进入组合,则状态和相关节点将移动到新调用的位置。如果没有添加新的调用,状态将被永久移除,并通知 remember 观察器。如果
movableContentOf
lambda 在同一组合中被多次调用,则为每个调用创建新的状态和节点,并且随着调用离开组合和新调用进入,状态将按照调用顺序从第一个离开的调用移动到进入的调用。所有未被新调用声明的状态都将被永久移除。除了这些和其他一些新功能外,还花费了大量时间来稳定运行时和快照状态系统。移除了各种内存泄漏并优化了代码路径。
以下是更改摘要列表
1.2
中的新功能
- 添加实验性快照 unsafeEnter/Leave
- 添加 Snapshot.asContextElement 实验性 API
- 引入 Snapshot.withoutReadObservation
- 允许状态在组合内移动
- Compose 中的重新组合追踪
1.2
中的性能
1.2
中的错误修复
- 从发布重新组合作用域中移除跟踪信息
- 当派生状态在其他作用域中读取时,阻止从组合中移除它
- 在 SnapshotStateObserver 中使用更高效的 removeScope()
- 清理组合中的派生状态依赖项
- 修复 movable 内容内部重新组合后 currentCompositeKeyHash 更改的问题
- 在处置期间清理失效组合
- 修复重新组合期间派生状态读取问题
- 修复观察派生状态对象时的内存泄漏
- 修复 movableContent 组合哈希键不一致的问题
- 修复组合器崩溃的边缘情况
- 确保强制失效组会强制重新组合
- 修复 rememberSaveable 与输入一起使用时恢复顺序错误的问题
版本 1.2.0-rc03
2022 年 6 月 29 日
androidx.compose.runtime:runtime-*:1.2.0-rc03
发布。版本 1.2.0-rc03 包含以下提交。
Bug 修复
- 派生状态观察以前无条件地从重新组合作用域和组合中一起移除,这破坏了可能仍在观察派生状态的其他作用域。此更改仅在没有其他作用域观察派生状态时才移除派生状态实例。( b/236618362)
版本 1.2.0-rc02
2022 年 6 月 22 日
androidx.compose.runtime:runtime-*:1.2.0-rc02
发布。版本 1.2.0-rc02 包含以下提交。
版本 1.2.0-rc01
2022 年 6 月 15 日
androidx.compose.runtime:runtime-*:1.2.0-rc01
发布。版本 1.2.0-rc01 包含以下提交。
API 变更
- Compose 库中的接口现在使用 jdk8 默认接口方法构建 (I5bcf1)
版本 1.2.0-beta03
2022 年 6 月 1 日
androidx.compose.runtime:runtime-*:1.2.0-beta03
发布。版本 1.2.0-beta03 包含以下提交。
版本 1.2.0-beta02
2022 年 5 月 18 日
androidx.compose.runtime:runtime-*:1.2.0-beta02
发布。版本 1.2.0-beta02 包含以下提交。
版本 1.2.0-beta01
2022 年 5 月 11 日
androidx.compose.runtime:runtime-*:1.2.0-beta01
发布。版本 1.2.0-beta01 包含以下提交。
新功能
- 这是 1.2 的第一个 Beta 版本!
API 变更
- 添加了实验性
Snapshot.unsafeEnter/unsafeLeave
(I108f3) - 添加了实验性
Snapshot.asContextElement()
API (Iff072) @ComposableTarget
注解和由@ComposableTargetMarker
标记的注解现在可以使用@file
前缀在文件范围内使用。在文件范围内使用目标注解将使编译器假定文件中的所有可组合函数都旨在定位关联的应用程序。例如,使用@file:UiComposable
声明所有@Composable
函数都定位 Compose UI 应用程序。需要定位另一个应用程序的函数必须显式提供所需应用程序的目标标记注解。( I40804)
版本 1.2.0-alpha08
2022 年 4 月 20 日
androidx.compose.runtime:runtime-*:1.2.0-alpha08
发布。版本 1.2.0-alpha08 包含以下提交。
API 变更
- 添加
TracingInProgress
到CompositionTracer
接口。( Ic6f12) - 向 Composer 添加
recomposeScopeIdentity
(I0c873) - 将追踪 API (Composer.setTracer) 限制为
OptIn(InternalComposeTracingApi)
。( I9187f) - 添加了
ResuableContentHost
,它允许更好地控制为可重用内容创建的状态的生命周期。例如,如果子组合暂时不使用,则可以停用内容,导致组合中所有记住的状态被遗忘,从而触发(例如)所有可处置效果。( I2c0f2, b/220322704)
版本 1.2.0-alpha07
2022 年 4 月 6 日
androidx.compose.runtime:runtime-*:1.2.0-alpha07
发布。版本 1.2.0-alpha07 包含以下提交。
API 变更
- 添加了新函数
Snapshot.withoutReadObservation { ... }
。它允许用户运行传入的 lambda,而无需订阅此块期间读取的状态值的更改。您会发现在某些用例中这很有用,例如您希望受益于基于快照的线程安全写入/读取,但又希望能够在不引起不必要的重新组合或重新测量的情况下读取值。( I9f365, b/214054486)
版本 1.2.0-alpha06
2022 年 3 月 23 日
androidx.compose.runtime:runtime-*:1.2.0-alpha06
发布。版本 1.2.0-alpha06 包含以下提交。
版本 1.2.0-alpha05
2022 年 3 月 9 日
androidx.compose.runtime:runtime-*:1.2.0-alpha05
发布。版本 1.2.0-alpha05 包含以下提交。
外部贡献
- 更新以使用 Kotlinx coroutines 1.6.0 (I3366d)
版本 1.2.0-alpha04
2022 年 2 月 23 日
androidx.compose.runtime:runtime-*:1.2.0-alpha04
发布。版本 1.2.0-alpha04 包含以下提交。
API 变更
添加了
ComposableTarget
、ComposableTargetMarker
和ComposableOpenTarget
,允许在编译时报告可组合函数被调用以定位非其设计使用的应用程序的情况。在大多数情况下,注解可以由 Compose 编译器插件推断,因此直接使用这些注解应该很少见。无法推断的情况包括创建和使用自定义应用程序、抽象可组合函数(例如接口方法)、作为可组合 lambda 的字段或全局变量(局部变量和参数被推断)、或使用
ComposeNode
或相关的可组合函数时。对于自定义应用程序,调用
ComposeNode
或ReusableComposeNode
的可组合函数需要为函数和任何可组合 lambda 参数类型添加CompoableTarget
注解。但是,建议创建使用ComposableTargetMarker
注解的注解,然后使用标记的注解而不是直接使用ComposableTarget
。使用ComposableTargetMarker
标记的可组合注解等效于ComposbleTarget
,其中应用程序参数是属性类的完全限定名称。有关使用ComposableTargetMarker
的示例,请参阅anroidx.compose.ui.UiComposable
。( I38f11)
版本 1.2.0-alpha03
2022 年 2 月 9 日
androidx.compose.runtime:runtime-*:1.2.0-alpha03
发布。版本 1.2.0-alpha03 包含以下提交。
API 变更
添加了
movableContentOf
,它将可组合 lambda 转换为一个 lambda,该 lambda 会将其状态和相应的节点移动到它被调用的任何新位置。当之前的调用离开组合时,状态会暂时保留,如果对 lambda 的新调用进入组合,则状态和相关节点将移动到新调用的位置。如果没有添加新的调用,状态将被永久移除,并通知 remember 观察器。如果
movableContentOf
lambda 在同一组合中被多次调用,则为每个调用创建新的状态和节点,并且随着调用离开组合和新调用进入,状态将按照调用顺序从第一个离开的调用移动到进入的调用。所有未被新调用声明的状态都将被永久移除。( Ib4850)添加了组合追踪 API,使工具能够提供更详细的可组合函数追踪。编译器现在生成对追踪 API 的调用,其中包含源信息。( Ib0eb5)
要从发布版本中移除这些调用和相关的源信息,请添加以下 Proguard 规则
-assumenosideeffects public class androidx.compose.runtime.ComposerKt { boolean isTraceInProgress(); void traceEventStart(int,java.lang.String); void traceEventEnd(); }
添加
InternalComposeScope
,它使工具能够在重新组合期间识别可组合项。( I07a3f)
版本 1.2.0-alpha02
2022 年 1 月 26 日
androidx.compose.runtime:runtime-*:1.2.0-alpha02
发布。版本 1.2.0-alpha02 包含以下提交。
版本 1.2.0-alpha01
2022 年 1 月 12 日
androidx.compose.runtime:runtime-*:1.2.0-alpha01
发布。版本 1.2.0-alpha01 包含以下提交。
API 变更
- 为
CompositionData
添加了identity
字段,用于在布局检查器中生成不变的 ID。( Ic116e)
依赖项更新
- 现在依赖 Kotlin
1.6.10
。
版本 1.1
版本 1.1.1
2022 年 2 月 23 日
androidx.compose.runtime:runtime-*:1.1.1
发布。版本 1.1.1 包含以下提交。
Bug 修复
- 修复
androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList
处的NullPointerException
(aosp/1947059, b/206677462) - 修复从 Android 剪贴板读取时因剪贴板内容导致的崩溃。( I06020, b/197769306)
- 修复
LazyVerticalGrid
中的 RTL (aosp/1931080, b/207510535)
版本 1.1.0
2022 年 2 月 9 日
androidx.compose.runtime:runtime-*:1.1.0
发布。版本 1.1.0 包含以下提交。
自 1.0.0 以来重要更改
- 稳定支持 Android 12 Overscroll 效果
- 改进触摸目标大小
- 请注意,相对于 Compose 1.0,Material 组件将扩展其布局空间以满足 Material 无障碍指南中关于触摸目标大小的要求。例如,Button 的触摸目标将扩展到至少
48x48dp
的最小尺寸,即使您将 Button 的尺寸设置得更小。这使 Compose Material 与 Material Design 组件的行为保持一致,如果您混合使用 View 和 Compose,则提供一致的行为。此更改还确保当您使用 Compose Material 组件创建 UI 时,将满足触摸目标可访问性的最低要求。 - 稳定支持 Navigation Rail
- 将许多以前的实验性 API 升级为稳定版
- 支持更高版本的 Kotlin
版本 1.1.0-rc03
2022 年 1 月 26 日
androidx.compose.runtime:runtime-*:1.1.0-rc03
发布。版本 1.1.0-rc03 包含以下提交。
Bug 修复
- 更新以支持 Compose Material
1.1.0-rc03
版本 1.1.0-rc01
2021 年 12 月 15 日
androidx.compose.runtime:runtime-*:1.1.0-rc01
发布。版本 1.1.0-rc01 包含以下提交。
版本 1.1.0-beta04
2021 年 12 月 1 日
androidx.compose.runtime:runtime-*:1.1.0-beta04
发布。版本 1.1.0-beta04 包含以下提交。
新功能
- 更新以兼容 Kotlin
1.6.0
版本 1.1.0-beta03
2021 年 11 月 17 日
androidx.compose.runtime:runtime-*:1.1.0-beta03
发布。版本 1.1.0-beta03 包含以下提交。
版本 1.1.0-beta02
2021 年 11 月 3 日
androidx.compose.runtime:runtime-*:1.1.0-beta02
发布。版本 1.1.0-beta02 包含以下提交。
API 变更
- 快照代码被拆分为多个文件,但所有文件仍位于同一个 JVM 类中。( Ic6c98)
版本 1.1.0-beta01
2021 年 10 月 27 日
androidx.compose.runtime:runtime-*:1.1.0-beta01
发布。版本 1.1.0-beta01 包含以下提交。
版本 1.1.0-alpha06
2021 年 10 月 13 日
androidx.compose.runtime:runtime-*:1.1.0-alpha06
发布。版本 1.1.0-alpha06 包含以下提交。
API 变更
- 从 Composer 方法中移除了
InternalCompilerApi
,这些方法需要在跨模块调用 (I1aa0b) Recomposer.state
已弃用,并替换为Recomposer.currentState
,以将其类型更改为 StateFlow (Ic2ab3, b/197773820)
版本 1.1.0-alpha05
2021 年 9 月 29 日
androidx.compose.runtime:runtime-*:1.1.0-alpha05
发布。版本 1.1.0-alpha05 包含以下提交。
版本 1.1.0-alpha04
2021 年 9 月 15 日
androidx.compose.runtime:runtime-*:1.1.0-alpha04
发布。版本 1.1.0-alpha04 包含以下提交。
版本 1.1.0-alpha03
2021 年 9 月 1 日
androidx.compose.runtime:runtime-*:1.1.0-alpha03
发布。版本 1.1.0-alpha03 包含以下提交。
新功能
- Compose 编译器现在支持旧版本的 Compose Runtime (1.0)。在此更改之前,Compose 编译器仅兼容相同版本或更高版本的 Compose Runtime。此更改之后,Compose 编译器兼容旧版本的 Compose Runtime (1.0)。(aosp/1796968)
- 更新 Compose
1.1.0-alpha03
以依赖 Kotlin1.5.30
。( I74545)
版本 1.1.0-alpha02
2021 年 8 月 18 日
androidx.compose.runtime:runtime-*:1.1.0-alpha02
发布。版本 1.1.0-alpha02 包含以下提交。
版本 1.1.0-alpha01
2021 年 8 月 4 日
androidx.compose.runtime:runtime-*:1.1.0-alpha01
发布。版本 1.1.0-alpha01 包含以下提交。
版本 1.0
版本 1.0.5
2021 年 11 月 3 日
androidx.compose.runtime:runtime-*:1.0.5
发布。版本 1.0.5 包含以下提交。
Bug 修复
- 修复了跟踪 derivedStateOf 实例的崩溃问题。( aosp/1792247)
版本 1.0.4
2021 年 10 月 13 日
androidx.compose.runtime:runtime-*:1.0.4
发布。版本 1.0.4 包含以下提交。
依赖项更新
- 更新以依赖 Kotlin
1.5.31
版本 1.0.3
2021 年 9 月 29 日
androidx.compose.runtime:runtime-*:1.0.3
发布。版本 1.0.3 包含以下提交。
依赖项更新
- 更新以依赖 Kotlin
1.5.30
版本 1.0.2
2021 年 9 月 1 日
androidx.compose.runtime:runtime-*:1.0.2
发布。版本 1.0.2 包含以下提交。
更新以支持 Compose 1.0.2
版本。Compose 1.0.2
仍然兼容 Kotlin 1.5.21
。
版本 1.0.1
2021 年 8 月 4 日
androidx.compose.runtime:runtime-*:1.0.1
发布。版本 1.0.1 包含以下提交。
依赖项更新
- 更新以依赖 Kotlin
1.5.21
。
版本 1.0.0
2021 年 7 月 28 日
androidx.compose.runtime:runtime-*:1.0.0
发布。版本 1.0.0 包含以下提交。
1.0.0 的主要功能
这是 Compose 的第一个稳定版本。请参阅官方 Compose 发布博客了解更多详情!
已知问题
如果您使用的是 Android Studio Bumblebee Canary 4 或 AGP
7.1.0-alpha04
/7.1.0-alpha05
,您可能会遇到以下崩溃问题java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
要修复此问题,请暂时在
build.gradle
文件中将minSdkVersion
增加到 24+。此问题将在下一版本的 Android Studio Bumblebee 和 AGP7.1
中修复。( b/194289155)
版本 1.0.0-rc02
2021 年 7 月 14 日
androidx.compose.runtime:runtime-*:1.0.0-rc02
发布。版本 1.0.0-rc02 包含以下提交。
- 修复了 SnapshotStateObserver 中的竞争条件,该条件导致零星的 NullPointerExceptions。( aosp/1763445, aosp/1758105, b/192677711)
- 修复了运行时快照导致
java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied
崩溃的问题。( b/193006595, b/192570897)
版本 1.0.0-rc01
2021 年 7 月 1 日
androidx.compose.runtime:runtime-*:1.0.0-rc01
发布。版本 1.0.0-rc01 包含以下提交。
版本 1.0.0-beta09
2021 年 6 月 16 日
androidx.compose.runtime:runtime-*:1.0.0-beta09
发布。版本 1.0.0-beta09 包含以下提交。
添加配置文件规则
此版本为以下 compose 模块添加了配置文件规则 (I14ed6)
androidx.compose.animation
- androidx.compose.animation-core
androidx.compose.foundation
- androidx.compose.foundation-layout
androidx.compose.material
- androidx.compose.material-ripple
androidx.compose.runtime
androidx.compose.ui
- androidx.compose.ui.geometry
- androidx.compose.ui.graphics
- androidx.compose.ui.text
- androidx.compose.ui.text
- androidx.compose.ui.unit
- androidx.compose.ui.util
什么是配置文件规则?
库的配置文件规则在位于
src/main
或等效目录中的文本文件baseline-prof.txt
中指定。该文件每行指定一条规则,其中规则是用于匹配库中的方法或类的模式。这些规则的语法是人类可读的 ART 配置文件格式的超集,该格式在使用adb shell profman --dump-classes-and-methods ...
时使用。这些规则有两种形式,分别用于定位方法或类。方法规则将具有以下模式
<FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
类规则将具有以下模式
<CLASS_DESCRIPTOR>
其中
<FLAGS>
是字符H
、S
和P
中的一个或多个,用于指示此方法是否应标记为“热”(Hot)、“启动”(Startup)或“启动后”(Post Startup)。<CLASS_DESCRIPTOR>
是目标方法所属类的描述符。例如,类androidx.compose.runtime.SlotTable
的描述符将为Landroidx/compose/runtime/SlotTable;
。<METHOD_SIGNATURE>
是方法的签名,包括方法的名称、参数类型和返回类型。例如,LayoutNode
上的方法fun isPlaced(): Boolean
的签名为isPlaced()Z
。这些模式可以包含通配符(
**
、*
和?
),以便单个规则可以涵盖多个方法或类。
这些规则有什么作用?
带有标志
H
的方法表示此方法是“热”方法,应提前编译。带有标志
S
的方法表示它是在启动时调用的方法,应提前编译以避免启动时编译和解释方法的开销。带有标志
P
的方法表示它是在启动后调用的方法。此文件中存在的类表示它在启动期间使用,应在堆中预先分配以避免类加载的开销。
这是如何工作的?
- 库可以定义这些规则,这些规则将打包在 AAR 工件中。当包含这些工件的应用程序构建时,这些规则将合并在一起,合并后的规则用于构建特定于应用程序的紧凑二进制 ART 配置文件。然后,ART 可以在应用程序安装到设备上时利用此配置文件,以便提前编译应用程序的特定子集,从而提高应用程序的性能,尤其是首次运行时的性能。请注意,这对于可调试应用程序无效。
版本 1.0.0-beta08
2021 年 6 月 2 日
androidx.compose.runtime:runtime-*:1.0.0-beta08
发布。版本 1.0.0-beta08 包含以下提交。
API 变更
State<T>
现在是State<out T>
(I69049)ControlledComposition
API 更改,以实现在一次重新组合中重新组合更改。( Iaafd1, b/184173932)
版本 1.0.0-beta07
2021 年 5 月 18 日
androidx.compose.runtime:runtime-*:1.0.0-beta07
发布。版本 1.0.0-beta07 包含以下提交。
API 变更
- 添加了新的 Compose 编译器 API,允许在源代码最小化期间删除编译器生成的源信息。( Ia34e6)
引入了
ReusableContent
,它将在键更改时尝试重用其内容中的节点,而不是替换它们。当键更改时,内容槽表中的先前值将被忽略,但生成的节点和用于更新节点的值除外。引入了
ReusableComposeNode
,它将重用发出的节点,而不是像ComposeNode
那样替换它。( I1dd86)@ComposeCompilerApi
不再是@RequiresOptIn
(Iab690)
Bug 修复
- LazyColumn/Row 现在将最多保留 2 个以前可见的项目处于活动状态(未释放),即使它们已经滚动出屏幕。这允许组件在需要组合新项目时重用活动的子组合,从而提高滚动性能。( Ie5555)
版本 1.0.0-beta06
2021 年 5 月 5 日
androidx.compose.runtime:runtime-*:1.0.0-beta06
发布。版本 1.0.0-beta06 包含以下提交。
API 变更
@ComposeCompilerApi
不再是@RequiresOptIn
(Iab690)
版本 1.0.0-beta05
2021 年 4 月 21 日
androidx.compose.runtime:runtime-*:1.0.0-beta05
发布。版本 1.0.0-beta05 包含以下提交。
API 变更
- 移除了用于记录快照读写的
@InternalComposeApi
(Id134d)
Bug 修复
- ui-test-manifest 和 ui-tooling-data 中的 AndroidManifest 文件现在与 Android 12 兼容 (I6f9de, b/184718994)
版本 1.0.0-beta04
2021 年 4 月 7 日
androidx.compose.runtime:runtime-*:1.0.0-beta04
发布。版本 1.0.0-beta04 包含以下提交。
Bug 修复
在此更改之前,局部可组合函数是根据其参数可跳过的。在此更改之后,没有局部可组合函数会跳过。此更改是因为局部函数通常和预期会从父级捕获参数,并且它们跳过是常见的错误源。
总而言之,考虑以下示例
@Composable fun Counter(count: Int, onCountChange: (Int) -> Unit) { @Composable fun ShowCount() { Text("Count: $count") } ShowCount() Button(onClick={ onCountChange(count + 1) }) { Text("Increment") } }
在此更改之前,
ShowCount
可组合函数总是会跳过,即使count
参数已更新。现在不再是这种情况。( I5648a)修复了
rememberSaveable()
与输入参数一起使用时恢复旧值的问题 (I1b110, b/182403380)
版本 1.0.0-beta03
2021 年 3 月 24 日
androidx.compose.runtime:runtime-*:1.0.0-beta03
发布。版本 1.0.0-beta03 包含以下提交。
API 变更
DefaultMonotonicFrameClock
已弃用。现在,在没有MonotonicFrameClock
的情况下调用withFrameNanos
或Recomposer.runRecomposeAndApplyChanges
将抛出IllegalStateException
。( I4eb0d)
版本 1.0.0-beta02
2021 年 3 月 10 日
androidx.compose.runtime:runtime-*:1.0.0-beta02
发布。版本 1.0.0-beta02 包含以下提交。
Bug 修复
- 强制限制实验性 API 的公共使用 (I6aa29, b/174531520)
- 修复了在 navigation-compose 的目标内部使用
rememberSaveable { mutableStateOf(0) }
时出现的问题。( I1312b, b/180042685, b/180701630)
版本 1.0.0-beta01
2021 年 2 月 24 日
androidx.compose.runtime:runtime-*:1.0.0-beta01
发布。版本 1.0.0-beta01 包含以下提交。
这是 Compose 1.0.0 Beta 的首次发布。
API 变更
- 添加
Recomposer.runRecomposeConcurrentlyAndApplyChanges
实验性 API,用于在主帧循环之外重新组合失效的组合。( I342d0) - 任何标有 @ReadOnlyComposable 的可组合项现在都经过编译时验证,以确保它们只调用其他 @ReadOnlyComposables。( I58961)
compositionLocalOf
和staticCompositionLocalOf
的defaultFactory
现在是必需的,而不是可选的。此更改消除了在未提供默认工厂时非空类型可能出现的潜在类型错误。以前,这会为非空类型提供空引用。
对于可空类型,请考虑提供
{ null }
作为默认工厂。我们不建议使用非空类型的局部变量,除非可以提供合理的默认值。如果不存在合理的默认值,则
defaultFactory
lambda 应抛出异常。然而,抛出异常意味着局部变量的消费者将隐式依赖于它的提供,而这不被类型系统强制执行。( Ifbd2a)已从 Compose 运行时中移除已弃用的符号 (I3252c)
已移除已弃用的
emptyContent()
。请改用{}
。( Idb33f, b/179432510)Providers 已重命名为 CompositionLocalProvider
- Composition 构造函数不再接受键参数,并且已弃用。
- currentCompositeKeyHash 已转换为可组合的顶级属性,而不是可组合的顶级函数。
- CompositionData 和 CompositionGroup 已移至 androidx.compose.runtime.tooling 命名空间
- ComposableLambda 已成为接口而非具体类,并且不再具有类型参数。
- ComposableLambdaN 已成为接口而非具体类,并且不再具有类型参数。
- snapshotFlow 函数已移至 androidx.compose.runtime 命名空间
- SnapshotMutationPolicy 的 merge 方法不再是实验性功能
- 已移除 @TestOnly 顶层 clearRoots 函数。它不再需要。
- 已移除 keySourceInfoOf 和 resetSourceInfo 函数。它们不再需要。
- 已移除 Composer.collectKeySourceInformation。它不再需要。
- 已移除 isJoinedKey、joinedKeyLeft 和 joinedKeyRight 方法。它们不再需要。
- 各种顶级 API 已被移动并重新组织到不同的文件中。由于 Kotlin 的文件类语义,这会破坏二进制兼容性,但不会破坏源代码兼容性,因此对于大多数用户来说应该不是问题。
- (I99b7d, b/177245490)
SnapshotStateObserver 不再是实验性功能 (Id2e6a)
删除了一些先前已弃用的 API (Ice5da, b/178633932)
进行了以下 Material API 更改
- 为 Top/BottomAppBar 添加了 contentPadding 参数,以允许自定义默认内边距。
- 重新排序了 BackdropScaffold 中的参数,以遵循 API 准则,即必需参数应在可选参数之前。
- 将 BottomNavigationItem 中的
icon
参数移到selected
和onClick
之后。 - 将 BottomNavigationItem 中的
alwaysShowLabels
参数重命名为alwaysShowLabel
。 - 将一些组件中的
bodyContent
参数重命名为content
。 - 重新排序了
ButtonDefaults.buttonColors()
中的参数。请注意,由于参数的类型未更改,这不会导致您的代码出错 — 请确保您使用命名参数或手动更新顺序,否则您的代码将无法像以前一样工作。 - 已向
darkColors()
添加secondaryVariant
参数。在深色主题中,此颜色通常与secondary
相同,但为了保持一致性和进一步自定义而添加。 - 已将 ElevationDefaults 和 animateElevation() 从公共 API 表面移除,因为它们不常用/不实用。
- 已将
Slider
中的onValueChangeEnd
重命名为onValueChangeFinished
并使其可为空。 - 已将
Snackbar
中的text
参数重命名为content
以保持一致性。 - 已向
DropdownMenuItem
添加contentPadding
参数,以允许自定义默认内边距,并使content
成为RowScope
上的扩展。 - 已将
ModalDrawerLayout
重命名为ModalDrawer
。 - 已将
BottomDrawerLayout
重命名为BottomDrawer
。 - (I1cc66)
版本 1.0.0-alpha12
2021 年 2 月 10 日
androidx.compose.runtime:runtime-*:1.0.0-alpha12
已发布。版本 1.0.0-alpha12 包含以下提交。
API 变更
- 对 ViewGroups 的支持已从 UiApplier 中移除。已移除弃用的 emitView 可组合项。( Ifb214 )
- CompositionReference 重命名为 CompositionContext ( I53fcb )
- ComponentActivity.setContent 已移至 androidx.activity:activity-compose 模块中的 androidx.activity.compose.setContent。( Icf416 )
- Snapshot API 已更新,以更符合 API 指南,并从公共 API 中隐藏了内部实现类。( Id9e32 )
- 已重命名 Ambients 以匹配 Ambient -> CompositionLocal 的重命名。Ambients 以前被命名为 AmbientFoo,现在 CompositionLocals 被命名为 LocalFoo。( I2d55d )
- Ambient 已重命名为 CompositionLocal,ambientOf / staticAmbientOf 分别重命名为 compositionLocalOf / staticCompositionLocalOf。此更改有助于更清晰地阐明 CompositionLocal 的目的:一种用于提供/检索组合局部值的机制。CompositionLocal 实例应以
Local
为前缀,例如 val LocalFoo = compositionLocalOf { Foo() }。( Ia55b6 ) - takeMutableSnapshot 和 takeSnapshot 已移至 Snapshot 的伴生方法。( I91f19 )
@ComposableContract
已弃用,取而代之的是三个更具体的注解。@ComposableContract(restartable = false)
已变为@NonRestartableComposable
@ComposableContract(readonly = true)
已变为@ReadOnlyComposable
@ComposableContract(preventCapture = true)
已变为@DisallowComposableCalls
@ComposableContract(tracked = true)
已移除。( I60a9d )emptyContent() 和 (@Composable () -> Unit).orEmpty() 实用程序已弃用,因为它们不再具有任何积极的性能影响或价值。( I0484d )
snapshotFlow
和withMutableSnapshot
不再是实验性功能。( I6a45f )Recomposer 现在可以关闭。已关闭的 recomposer 将继续重组,直到组合子协程完成。
Recomposer.shutDown
重命名为 cancel 以与 close 区分。( Ib6d76 )compose:runtime-dispatch
工件现已弃用。MonotonicFrameClock 现在可以在 compose:runtime 中找到,AndroidUiDispatcher 可以在 compose:ui 中找到。( Ib5c36 )Compose 编译器插件目标 API 已重构为使用接口而非具体类。该接口也不再使用类型参数。
这是一项内部更改,不应影响源代码兼容性,但属于二进制破坏性更改。( I3b922, b/169406779 )
引入了 SnapshotMutableState ( Icfd03 )
DisposableEffectDisposable 重命名为 DisposaleEffectResult ( Ica7c6 )
移除了 Recomposer.current()。[Abstract]ComposeView 现在默认使用延迟创建的、窗口范围的 Recomposer,由窗口的 ViewTreeLifecycleOwner 驱动。当宿主生命周期停止时,重组和基于 withFrameNanos 的动画计时会暂停。( I38e11 )
Recomposer.runningRecomposers 现在提供了一个全局 StateFlow,包含只读 RecomposerInfo,用于观察进程中正在进行的组合状态。优先使用此 API,而非现已弃用的 Recomposer.current()。( If8ebe )
DisposableEffectDisposable 重命名为 DisposaleEffectResult ( I3ea68 )
版本 1.0.0-alpha11
2021 年 1 月 28 日
androidx.compose.runtime:runtime-*:1.0.0-alpha11
已发布。版本 1.0.0-alpha11 包含以下提交。
API 变更
- onCommit、onDispose 和 onActive 已弃用,取而代之的是 SideEffect 和 DisposableEffect API ( If760e )
- emit() API 及所有重载已弃用并重命名为 ComposeNode。这些 API 是相同的,只是名称不同,以遵循 Compose 的命名约定。( I4137b )
- invalidate 和 compositionReference() 现已弃用,取而代之的分别是 currentRecomposeScope 和 rememberCompositionReference。( I583a8 )
RememberObserver 替代了 CompositionLifecycleObserver,CompositionLifecycleObserver 现已弃用。
RememberObserver
是CompositionLifecycleObserver
的替代品,具有修改后的语义和重命名的方法。对于仅被记住一次的对象(这是且仍然是推荐的做法),可以机械地更改为新的 API。然而,如果一个引用在一个组合中被记住多次,那么onRemembered
会为每个引用调用,而onEnter
只会被调用一次。如果对象在子组合中使用(例如WithConstraints
和Scaffold
),onEnter
会被多次调用,这使得单个onEnter
调用的保证不可靠,因此在RememberObserver
中已将其移除。RememberObserver
添加了onAbandoned
,如果RememberObserver
实例从传递给remember
的回调中返回,但未在组合状态中被记住,因此永远不会调用onRemembered
,则会调用此方法。这可能发生在以下情况:异常在完成之前终止组合,或者组合被丢弃,因为其正在为其生成组合的状态不再是当前状态或不再需要。如果遵循上述单引用建议的RememberObserver
实例正在跟踪外部资源,则onForgotten
和onAbandoned
都表明该资源不再需要。如果对象正在跟踪onRemembered
中启动的工作或分配的资源,则可以忽略onAbandoned
,因为它在onRemembered
被调用时不会被调用。( I02c36 )不要将
collectAsState()
函数标记为内联。( Ia73e4 )
Bug 修复
- WithConstraints 已重构为 BoxWithConstraints 并移至 foundation.layout。( I9420b, b/173387208 )
- 在测试中利用 TestCoroutineDispatcher ( I532b6 )
版本 1.0.0-alpha10
2021 年 1 月 13 日
androidx.compose.runtime:runtime-*:1.0.0-alpha10
已发布。版本 1.0.0-alpha10 包含以下提交。
破坏性更改
内部编译器 API 的重构允许将组合产生的节点更改批量处理到组合的“应用更改”阶段,即在所有
@Composable
函数完成之后。这是一种行为上的破坏性更改,可能会影响应用程序代码,因为在应用更改之前,节点无法从内部和实验性 API 获得。这通常可以通过将包含此类依赖的代码封装在
SideEffect
可组合项中来解决,以将代码的执行推迟到节点创建和初始化之后。( I018da )
API 变更
- 添加了一种跟踪 recomposer 是否已应用更改的方法。( I1b3e2 )
扩展 [Abstract]ComposeView API,允许回收基于 Compose 的视图,处置其组合以便稍后重新创建。添加用于安装和发现窗口范围 Recomposers 和 CompositionReferences 的 API,以创建子组合。
添加 ViewCompositionStrategy 以配置 [Abstract]ComposeViews 的组合处置策略;默认行为是在窗口分离时处置。( I860ab )
Bug 修复
- Recomposer 现在公开其当前状态的 Flow,允许监视其活动和相关效果的活动。( Ifb2b9 )
- 原生 keyEvent 现在可以通过 keyEvent.nativeKeyEvent 访问。( I87c57, b/173086397 )
版本 1.0.0-alpha09
2020 年 12 月 16 日
androidx.compose.runtime:runtime-*:1.0.0-alpha09
已发布。版本 1.0.0-alpha09 包含以下提交。
API 变更
已从公共 API 中移除 SlotTable、SlotReader 和 SlotWriter。这些以前被标记为 InternalComposeAPI。现在它们是 compose 模块的内部组件。
CompositionData 和 CompositionGroup 已添加,作为 ui-tooling API 的替代品,用于提取组合信息。这些是公共的,但不打算在 ui-tooling API 之外使用,因为它们提供了 ui-tooling API 解释的原始信息。( I31a9c )
Applier 类不再被认为是 ( Id85b0 )
Applier
接口已更改,以简化自下而上而非自上而下构建树。insert()
方法已重命名为insertTopDown()
。添加了一个新方法
insertBottomUp()
。applier 会根据性能选择使用
insertTopDown()
或insertBottomUp()
将节点插入其正在编辑的树中。某些树(如
LayoutNode
和View
)自下而上构建比自上而下构建效率更高。在此更改之前,需要插入堆栈来实现自下而上的构建,并且为了性能,需要将堆栈复制到每个需要自下而上构建的 applier。通过此更改,Applier
将覆盖insertBottomUp()
以自下而上地构建树,并覆盖insertTopDown()
以自上而下地构建树。( Icbdc2 )Compose 支持可以进行可组合调用的属性获取器。对这方面的支持不会取消,但声明属性获取器为 @Composable 的语法正在改变。
现在弃用的语法是直接注解属性本身
@Composable val someProperty: Int get() = ...
现在正确的语法是注解属性的获取器
val someProperty: Int @Composable get() = ...
两种语法都将在一段时间内有效,但前一个弃用的语法最终将成为编译错误。( Id9197 )
Bug 修复
- AndroidOwner 已转为内部 ( Ibcad0, b/170296980 )
- subcomposeInto(LayoutNode) 已转为内部 ( Id724a )
版本 1.0.0-alpha08
2020 年 12 月 2 日
androidx.compose.runtime:runtime-*:1.0.0-alpha08
已发布。版本 1.0.0-alpha08 包含以下提交。
API 变更
- 添加了可组合 lambda 参数命名和位置的 lint 检查,以检查与 Compose 准则的一致性。此外,根据 lint 检查和指南,一些使用
children
作为尾随 lambda 名称的 API 已迁移到content
。( Iec48e ) - Recomposer 不再接受 EmbeddingContext;所需的调度依赖项从 effectCoroutineContext 中获取。FrameManager 已弃用;平台集成应初始化其自己的全局快照处理。( I02369 )
- RestorableStateHolder.withRestorableState 函数已重命名为 RestorableStateProvider ( I66640 )
Bug 修复
- 已弃用以
Ambient
为后缀命名的 Ambients,并根据其他 Ambients 和 Compose API 指南,将其替换为以 Ambient 为前缀的新属性。( I33440 ) - 移除旧的 ui-test 模块及其存根 ( I3a7cb )
版本 1.0.0-alpha07
2020 年 11 月 11 日
androidx.compose.runtime:runtime-*:1.0.0-alpha07
已发布。版本 1.0.0-alpha07 包含以下提交。
新功能
API 变更
@UnionType
注解已弃用 ( I57cde )- 添加了 provideDefault 作为 provide 的替代方案,用于提供 ambients,并且它可以用于指定仅在没有 ambient 值已提供的情况下才设置的 ambient 值。( Id6635, b/171024925 )
- LaunchedTask 已重命名为 LaunchedEffect,以与 SideEffect 和 DisposableEffect API 保持一致。不允许使用无主体参数的 LaunchedEffect,以鼓励最佳实践。( Ifd3d4 )
- Applier 现在有 onBeginChanges/onEndChanges 回调,这些回调在 Composer 开始/完成向树应用更改时调用。这些可用于批量资源管理(如果需要)。( Icf476 )
- Recomposer 现在在构造时需要一个 CoroutineContext ( Ic4610 )
- 对内部 SlotTable 实现的更改,不应影响公共 API。( If9828 )
- 已移除不接受初始值的弃用 rxjava2 适配器 ( Idb72f )
Bug 修复
- foundation.Text 已弃用并替换为 material.Text。对于不使用主题值的基本、无偏见的文本 API,请参阅 androidx.compose.foundation.BasicText。( If64cb )
- BaseTextField 已弃用。请改用 BasicTextField。( I896eb )
- 多个与布局相关的符号已从 androidx.compose.ui 移至 androidx.compose.layout.ui。( I0fa98, b/170475424 )
外部贡献
- 为 compose 添加了
runtime-rxjava3
模块。类似于runtime-rxjava2
( I02cbf )
版本 1.0.0-alpha06
2020 年 10 月 28 日
androidx.compose.runtime:runtime-*:1.0.0-alpha06
已发布。版本 1.0.0-alpha06 包含以下提交。
API 变更
- Recomposer 现在是 CompositionReference 和有效的组合父级。现在在更少的地方需要显式 Recomposer。( I4036f )
- 添加了 DisposableEffect 对应 API 到 SideEffect,扮演带有参数的 onCommit 的角色,但需要一个 onDispose。
- 添加了 rememberUpdatedState API,用于将数据从重组发布到正在进行或长期存在的进程,例如 DisposableEffects 或 LaunchedTasks。
- ( Id50b9 )
- MutableVector 现在实现 RandomAccess ( I85d73, b/170461551 )
- 添加了 SideEffect 可组合项,用于将组合的副作用应用于由组合管理的对象。SideEffect 旨在替代 onCommit 可组合项。( Ia77c2 )
- 新的实验性 API RestorableStateHolder。它允许在处置子树之前保存使用 [savedInstanceState] 和 [rememberSavedInstanceState] 定义的状态,以便下次能够以恢复的状态重新组合它。( I66884, b/166586419 )
Bug 修复
- 在 ComposeTestRule 中启用过渡;从 ComposeTestRule 中移除启用闪烁光标的选项。( If0de3 )
版本 1.0.0-alpha05
2020 年 10 月 14 日
androidx.compose.runtime:runtime-*:1.0.0-alpha05
已发布。版本 1.0.0-alpha05 包含以下提交。
API 变更
- 实验性 Modifier.pointerInput 挂起输入修饰符 ( Ia77d2 )
- 通过在每次滚动时减少子组合中的工作量,提高了 LazyColumn/Row 的滚动性能。Composition 类新增了 hasInvalidations() 方法。Recomposer 中的 hasPendingChanges() 方法已重命名为 hasInvalidations() ( Ib2f32, b/168293643, b/167972292, b/165028371 )
- 添加 produceState API,用于从组合中启动协程,随时间更新单个
State<T>
值 ( Id4a57 ) - launchInComposition 重命名为 LaunchedTask 以匹配 Compose API 指南 ( I99a8e )
- 自定义布局中 place() 调用的顺序现在定义了子项的绘制顺序。( Ibc9f6 )
版本 1.0.0-alpha04
2020 年 10 月 1 日
androidx.compose.runtime:runtime-*:1.0.0-alpha04
已发布。版本 1.0.0-alpha04 包含以下提交。
API 变更
- 添加了 OwnerScope,以便在布局和绘图观察范围不再有效时进行回收。( Ic4cf8 )
- 添加了 derivedStateOf API,用于基于可能读取(并派生自)其他 State 对象的计算创建 State 对象。( If758b )
- 为 SnapshotStateObserver 添加了 TestOnly API ( I6e2a9 )
Bug 修复
- foundation.Box 已弃用。请改用 foundation.layout.Box。( Ie5950, b/167680279 )
版本 1.0.0-alpha03
2020 年 9 月 16 日
androidx.compose.runtime:runtime-*:1.0.0-alpha03
已发布。版本 1.0.0-alpha03 包含以下提交。
API 变更
CompositionCoroutineScope
不再实现MonotonicFrameClock
。withFrameNanos
的调用者应显式导入顶级函数。( Icb642, b/166778123 )
Bug 修复
- onNode 或 waitForIdle 等全局测试函数现已弃用,请迁移到 ComposeTestRule 上定义的新对应函数。( I7f45a )
launchInComposition
不再调度协程 ( Ief6af, b/166486000 )
版本 1.0.0-alpha02
2020 年 9 月 2 日
androidx.compose.runtime:runtime-*:1.0.0-alpha02
已发布。版本 1.0.0-alpha02 包含以下提交。
API 变更
- 添加
snapshotFlow
和withMutableSnapshot
API,用于消费和生成 Snapshot 数据更改。( I3e722 ) 可组合函数的调用约定已更改。这是一项二进制破坏性更改。所有库都必须重新编译才能与此版本的 compose 编译器插件一起使用。
此更改不会造成源代码级别的破坏性更改,因为唯一更改的 API 是需要显式选择加入的编译器 API。( I7afd2, b/158123185 )
从 EmbeddingContext 中移除了调度方法 ( I7b9be )
onPreCommit 已弃用;onCommit 现在具有 onPreCommit 的行为。
onCommit 和 onActive 现在在提交组合更改的相同渲染帧中运行,而不是在下一个渲染帧开始时运行。( I70403 )
版本 1.0.0-alpha01
2020 年 8 月 26 日
androidx.compose.runtime:runtime-*:1.0.0-alpha01
已发布。版本 1.0.0-alpha01 包含以下提交。
版本 0.1.0-dev
版本 0.1.0-dev17
2020 年 8 月 19 日
androidx.compose.runtime:runtime-*:0.1.0-dev17
已发布。版本 0.1.0-dev17 包含以下提交。
API 变更
- 自定义 emits 现在可以声明其一个或多个 setter 可以跳过并独立于 emit 进行重组。( Ibbd13 )
已移除弃用的 FrameManager 调用。
内部 Compose API 已更改,以减少跟踪
mutableStateOf()
等状态对象的开销。( I80ba6 )为了清晰起见,
state { ... }
可组合项现已弃用,请改为显式调用remember { mutableStateOf(...) }
。这减少了整体 API 表面和状态管理的概念数量,并与类属性委托的by mutableStateOf()
模式匹配。( Ia5727 )Flow.collectAsState 现在从组合本身确定默认调度器,而不是默认使用 Dispatchers.Main。( I9c1d9 )
修复了在 for 循环中使用保存状态的功能时崩溃的问题。现在 savedInstanceState() 中允许使用相同的键,UiSavedStateRegistry 的 API 已调整以满足此新要求。( I4ab76, b/160042650, b/156853976, b/159026663, b/154920561 )
Bug 修复
emitView
已弃用。如果可能,请改用AndroidView
在 Compose 内部发出 View。请注意,将来将不再支持直接组合 Views 和 ViewGroups,除非它们是组合树中的叶子,在这种情况下可以使用 AndroidView 实现。( I29b1e, b/163871221 )
版本 0.1.0-dev16
2020 年 8 月 5 日
androidx.compose.runtime:runtime-*:0.1.0-dev16
已发布。版本 0.1.0-dev16 包含以下提交。
API 变更
mutableStateOf()
、ambientOf()
和savedInstanceStateOf()
的默认突变策略已更改为structuralEqualityPolicy()
,而不是referentialEqualityPolicy()
。现在,判断分配给
mutableStateOf()
实例的新值是否被视为更改的默认方式是使用==
而不是===
。请参阅 https://kotlinlang.org/docs/reference/equality.html
ambientOf()
和savedInstanceStateOf()
在其实现中使用了mutableStateOf()
,因此它们被更改为与mutableStateOf()
保持一致。使用结构相等性更符合开发人员的预期。
例如,
val state = mutableStateOf(1f)
紧接着,
state.value = 1f
将不再被视为对
state
的更改,并且在组合期间使用state
将不再需要重组。这是一项破坏性更改,但在大多数情况下(例如使用未重写
equals()
的类时),这不会对应用程序产生显著影响。重写
equals()
的类(例如数据类)可能会出现性能下降,因为它们的equals()
方法现在默认在赋值给mutableStateOf()
时被调用。通过向
mutableStateOf()
、ambientOf()
和savedInstanceStateOf()
的调用添加策略参数policy = referentialEqualityPolicy()
,可以恢复以前的行为。( Ic21a7 )Row
和Column
现在是内联函数,大大减少了使用它们的开销。( I75c10 )
Bug 修复
- setViewContent 已弃用。应改用 setContent。( I7e497, b/160335130 )
添加了 MonotonicFrameAnimationClock,它允许您将 MonotonicFrameClock 用作 AnimationClockObservable,以弥合基于协程的新时钟与仍使用基于回调的旧时钟的 API 之间的差距。
ManualAnimationClock 的 MonotonicFrameClock 等价物现在是 ManualFrameClock。( I111c7, b/161247083 )
Modifier.stateDraggable 已完全重做并重命名为 Modifier.swipeable。引入了新的 SwipeableState 类,DrawerState 和 BottomDrawerState 已重构为继承自它。[Modal/Bottom]DrawerLayout 不再接受 onStateChange 参数。( I72332, b/148023068 )
Modifier.plus 已弃用,请改用 Modifier.then。'Then' 具有更强的顺序信号,同时禁止键入
Modifier.padding().background() + anotherModifier
,这会破坏链并使其更难阅读。( Iedd58, b/161529964 )SubcomposeLayout 已添加。它是一种低级原语,允许在测量期间组合子项,如果我们想在稍后的测量期间使用子树组合中可用的某些值。例如,WithConstraints 不是使用 SubcomposeLayout 实现的。( I25cc8 )
Material FilledTextField 已重命名为 TextField,基础的 TextField 已重命名为 BaseTextField,以便更容易发现和使用最简单的所需 API。( Ia6242, b/155482676 )
Modifier.drawBackground 已重命名为 Modifier.background ( I13677 )
版本 0.1.0-dev15
2020 年 7 月 22 日
androidx.compose.runtime:runtime-*:0.1.0-dev15
已发布。版本 0.1.0-dev15 包含以下提交。
依赖项更新
- 要使用 Compose 的
0.1.0-dev15
版本,您需要根据上方声明依赖项中显示的新代码片段更新您的依赖项。
API 变更
@Model
注解现已弃用。请使用 state 和 mutableStateOf 作为替代方案。这一弃用决定是在经过深思熟虑后达成的。理由
理由包括但不限于
- 减少 API 表面区域和我们需要教授的概念
- 更接近其他可比的工具包(Swift UI、React、Flutter)
- 可逆的决定。我们以后总可以重新引入
@Model
。 - 移除了需要处理的
@Model
配置中的边缘用例和难以回答的问题 @Model
数据类、equals、hashcode 等。- 如何让某些属性“被观察”而另一些不被观察?
- 如何指定观察中使用的结构相等性与引用相等性?
- 减少系统中的“魔法”。这将降低人们假设系统比实际更智能的可能性(例如,它知道如何比较列表)
- 使观察的粒度更直观。
- 提高了从变量到类属性的重构能力
- 潜在地开启了手动定制特定于状态的优化的可能性
- 与生态系统的其余部分更紧密对齐,并减少了对不可变或我们“接受可变状态”的歧义
迁移说明
几乎所有
@Model
的现有用法都可以通过以下两种方式之一轻松转换。下面的示例有一个带有两个属性的@Model
类,仅用于示例目的,并在可组合项中使用它。@Model class Position( var x: Int, var y: Int ) @Composable fun Example() { var p = remember { Position(0, 0) } PositionChanger( position=p, onXChange={ p.x = it } onYChange={ p.y = it } ) }
替代方案 1:使用
State<OriginalClass>
并创建副本。Kotlin 的数据类使得这种方法更容易。实质上,将所有以前的
var
属性转换为数据类的val
属性,然后使用state
而不是remember
,并使用数据类的copy(...)
便利方法将状态值分配给原始的克隆副本。重要的是要注意,这种方法仅在对该类的唯一修改是在创建
State
实例的同一作用域内完成时才有效。如果该类在使用范围之外内部自行变异,并且您依赖于对其的观察,那么您将需要使用下一个方法。data class Position( val x: Int, val y: Int ) @Composable fun Example() { var p by state { Position(0, 0) } PositionChanger( position=p, onXChange={ p = p.copy(x=it) } onYChange={ p = p.copy(y=it) } ) }
替代方案 2:使用 mutableStateOf 和属性委托
Kotlin 的属性委托和
mutableStateOf
API 使这种方法更容易,它允许您在组合之外创建 MutableState 实例。实质上,将原始类的所有var
属性替换为以mutableStateOf
作为其属性委托的var
属性。这样做的好处是类的用法根本不会改变,只有其内部实现会改变。尽管如此,行为并不完全与原始示例相同,因为现在每个属性都单独被观察/订阅,因此您在重构后看到的重组可能会更窄(这是好事)。class Position(x: Int, y: Int) { var x by mutableStateOf(x) var y by mutableStateOf(y) } // source of Example is identical to original @Composable fun Example() { var p = remember { Position(0, 0) } PositionChanger( position=p, onXChange={ p.x = it } onYChange={ p.y = it } ) }
( I409e8, b/152050010, b/146362815, b/146342522, b/143413369, b/135715219, b/143263925, b/139653744 )
改变了 Compose 编译器的代码生成策略。在此更改之前,Compose 编译器会转换对可组合函数的调用。通过此更改,我们现在转换可组合函数的主体,并(大部分)保持调用点不变。
这意味着与 Compose 运行时通信的大部分逻辑发生在函数体开始时,而不是在调用点。
这对于所有 Compose 用法都应该是源代码兼容的更改。大多数 Compose 用户不应因此更改而需要更新任何代码。
为了支持这项工作,所有可组合函数的 JVM 签名已更改。接受单个参数的可组合函数被转换为接受 3 个参数的函数,附加参数是 Composer、一个“键”整数和用于通过调用传播元数据的位掩码整数。
Compose 现在还会将默认参数转换为可组合函数。它这样做时不会引入函数本身的额外合成默认重载,因此此更改将导致定义的函数更少。
由此产生的已知有意行为更改
- 某些调用会跳过,而以前不会。
- 默认参数表达式中的可组合表达式现在已正确订阅和处理
这项工作包含一些优化:1. 参数比较的结果通过调用图传播到其他可组合函数。这将导致运行时比较次数减少,插槽表大小减小,以及跳过更多以前未跳过的可组合函数。2. 在编译时确定为“静态”的参数不再在运行时进行比较或存储。这减少了比较次数并减小了插槽表大小。3. 函数体内的控制流结构用于最小化生成的组的数量。这减小了插槽表大小并减少了运行时的开销。4. 如果函数中未使用的调度和接收器参数未在函数体内部使用,则不将其包含在确定函数可跳过性中。
大多数破坏性更改针对的是编译器直接目标的 API,Compose 的典型使用不会受到影响:1. Composer::startExpr 已移除 2. Composer::endExpr 已移除 3. Composer::call 已弃用 4.
key
的非变长参数重载已移除。今后请使用变长参数版本。5. Pivotal 注解已弃用。请使用key
作为替代。6. ScopeUpdateScope::updateScope 已更改为预期 Function3 而不是 Function1 7. restartableFunction 和 restartableFunctionN 已更新,以包含额外的编译时参数。( I60756, b/143464846 )MutableVector 中新增了 sortWith 和 removeRange ( Icccf7 )
为 CompositionLifecycleObserver 添加了默认方法实现 ( I24289 )
Applier 现在需要一个 clear() 方法来处置组合 ( Ibe697 )
为 MutableVector 添加了 asMutableList(),使其无需复制整个列表即可传递给公共 API。( I298df )
添加了 rememberCoroutineScope(),用于在组合中获取受管理的 CoroutineScope,以便在响应事件时启动任务。( I0e264 )
MutableVector 是一种新的集合,不实现任何标准 Collection 接口。此集合优先考虑速度,仅旨在用于内部实现。( I8ebd6 )
暂时移除了
StableMutableList
和StableMutableMap
,以避免 Compose 所需的 Kotlin 版本中的问题。一旦 Compose 更新到没有该问题的 Kotlin 版本,这些接口将重新引入。SnapshotStateList
和SnapshotStateMap
现已公开,但一旦StableMutableList
和StableMutableMap
恢复,它们将被弃用。( Ia7769 )添加顶级 withFrameNanos 函数用于动画计时 ( Ie34c5 )
@Untracked 注解已弃用。请替换为 @ComposableContract(tracked=false) ( Id211e )
RestartableFunction 和相关 API 已重命名为 ComposableLambda 等。这些 API 仅由编译器针对,因此通常不应影响源代码级别的兼容性。重命名主要是为了在堆栈跟踪中更好地传达此类的用途。( I7eb25 )
@Composable 注解不再对类有效。( Ia5f02 )
Ambient<T>
现在是 @Stable 而不是 @Immutable ( I0b4bb )在此更改之前,如果存在,Compose 编译器插件会非平凡地拦截 @Composable 函数内部对构造函数的调用。( I5205a, b/158123804 )
Recompose 可组合项不再是一个有用的抽象。大多数重组应由 MutableState 赋值引起。除此之外,建议使用
invalidate
函数触发当前范围的重组。( Ifc992 )Observe 不再是一个有用的抽象。如果您需要复制它,可以通过简单地创建一个执行可组合 lambda 参数的可组合函数来复制其实现。例如,
@Composable fun Observe(body: @Composable () -> Unit) = body()
( I40d37 )@Direct 已弃用,取而代之的是 @ComposableContract(restartable=false) ( If4708 )
为最近引入的 StateFlow 添加了一个适配器,它允许我们预填充初始值,以便返回的 State 为非空。( I61dd8, b/156233789 )
为 Flow 添加了一个适配器。用法示例:val value by flow.collectAsState() ( If2198, b/153375923 )
[Mutable]State 属性委托运算符已移至扩展,以支持 Kotlin 1.4 属性委托优化。调用者必须添加导入才能继续使用
by state { ... }
或by mutableStateOf(...)
。( I5312c )androidx.compose.ViewComposer 已移至 androidx.ui.node.UiComposer。androidx.compose.Emittable 已移除。它与 ComponentNode 重复。androidx.compose.ViewAdapters 已移除。它们不再是受支持的用例。Compose.composeInto 已弃用。请改用
setContent
或setViewContent
。Compose.disposeComposition 已弃用。请改用setContent
返回的Composition
上的dispose
方法。androidx.compose.Compose.subcomposeInto 已移至 androidx.ui.core.subcomposeInto。ComponentNode#emitInsertAt 已重命名为 ComponentNode#insertAt。ComponentNode#emitRemoveAt 已重命名为 ComponentNode#removeAt。ComponentNode#emitMode 已重命名为 ComponentNode#move。( Idef00 )将
ComposeFlags.COMPOSER_PARAM
标志更新为true
,这将更改 Compose 插件的代码生成策略。从高层次来看,这导致 @Composable 函数生成时带有一个额外的合成参数,该参数会传递给后续的 @Composable 调用,以便运行时正确管理执行。这是一项重要的二进制破坏性更改,但应在所有受批准的 Compose 用法中保持源代码级别的兼容性。( I7971c )ambient API 的破坏性更改。有关详细信息,请参阅日志和
Ambient<T>
文档。( I4c7ee, b/143769776 )添加了 ui-livedata - 带有 LiveData 适配器的新工件。用法示例:val value by liveData.observeAsState() ( Ie9e8c, b/150465596 )
没有显式初始值的 Rx 适配器已弃用。使用 null 并非总是最佳默认值,例如,当您有一个列表时,最好从 emptyList() 或任何其他合理的默认值开始。( I00025, b/161348384 )
添加了 ui-rxjava2 - 带有 RxJava2 适配器的新工件。用法示例:val value by observable.subscribeAsState() ( Ifab4b, b/153369097 )
savedInstanceState()
现在可以与可空类型一起使用 ( I6847f, b/153532190 )新增 listSaver() 和 mapSaver(),使编写自定义 Saver 对象更容易。( I8cf68, b/152331508 )
新函数:savedInstanceState() 和 rememberSavedInstanceState()。它们类似于 state() 和 remember(),但内置了保存实例状态支持。( If1987, b/152025209 )
Bug 修复
runOnIdleCompose
重命名为runOnIdle
( I83607 )- 将 LayoutNode 设为实验性 API ( I4f2e9 )
- androidx.ui.foundation.TextFieldValue 和 androidx.ui.input.EditorValue 已弃用。使用该类型的 TextField、FilledTextField 和 CoreTextField 可组合项也已弃用。请改用 androidx.ui.input.TextFieldValue。( I4066d, b/155211005 )
- 已移除弃用的 DrawBackground API,转而使用 Modifier 上的 drawBackground 扩展 API。重构了颜色、画刷和绘制背景的实现,以减少代码路径并消除将 Modifier 作为组合一部分创建的要求。( I0343a )
- 更新了暴露 Canvas 的更高级 Compose API,转而暴露 CanvasScope。这消除了消费者维护自己 Paint 对象的需要。对于仍需要访问 Canvas 的消费者,他们可以使用 drawCanvas 扩展方法,该方法提供回调以使用底层 Canvas 发出绘图命令。( I80afd )
- WithConstraints 尾随 lambda API 已更改。现在它不再有两个参数,而是有一个接收器范围,除了约束和布局方向外,还以 Dp 单位提供 minWidth、maxWidth、minHeight 和 maxHeight 属性。( I91b9a, b/149979702 )
- 添加了对称内边距修饰符。( I39840 )
- 更新了 wrapContentWidth 和 wrapContentHeight,以期望垂直或水平对齐,而不是任何对齐方式。gravity 修饰符已更新为接受垂直或水平对齐。Row、Column 和 Stack 已更新为支持自定义连续对齐。( Ib0728 )
- ui-text 模块已重命名为 ui-text-core ( I57dec )
- 改进 DrawModifier API
- 将 draw() 的接收器范围设为 ContentDrawScope
- 移除了 draw() 上的所有参数
- DrawScope 具有与以前的 CanvasScope 相同的接口
- ContentDrawScope 具有 drawContent() 方法 ( Ibaced, b/152919067 )
- ColoredRect 已弃用。请改用
Box(Modifier.preferredSize(width, height).drawBackground(color))
。( I499fa, b/152753731 ) - 将 Modifier 加号运算符替换为工厂扩展函数 ( I225e4 )
- RowScope 和 ColumnScope 成员现在可以在 Row 和 Column 之外访问。( I3a641 )
- LayoutFlexible 重命名为 LayoutWeight。tight 参数重命名为 fill。( If4738 )
- WithConstraints 获得了 LayoutDirection 参数 ( I6d6f7 )
- 将 background 重命名为 DrawBackground 并使其默认可记忆。( Ia0bd3 )
- 将 ButtonStyle 替换为不同的函数,并移除了 text(字符串)重载。有关用法信息,请参阅更新后的示例。( If63ab, b/146478620, b/146482131 )
runOnIdleCompose
和runOnUiThread
现在是全局函数,而不是 ComposeTestRule 上的方法。( Icbe8f )
外部贡献
- 从 Compose 运行时移植层中移除不必要的 API,例如 Looper 和 Handler ( I6847d )
- 弃用没有初始值的
Flow<T>.collectAsState()
。请改用StateFlow<T>
或传递显式初始值。( I63f98, b/157674865 )