Compose 运行时
androidx.compose.runtime
androidx.compose.runtime.rxjava2
androidx.compose.runtime.rxjava3
androidx.compose.runtime.saveable
androidx.compose.runtime.snapshots
(*查看所有 Compose 包的 API 参考文档*)
最新更新 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024年11月13日 | 1.7.5 | - | - | 1.8.0-alpha06 |
结构
Compose 是 androidx
中 7 个 Maven 组 ID 的组合。每个组都包含一个目标功能子集,每个子集都有自己的一套发行说明。
此表解释了这些组并链接到每一套发行说明。
组 | 描述 |
---|---|
compose.animation | 在他们的 Jetpack Compose 应用中构建动画以丰富用户体验。 |
compose.compiler | 转换@Composable函数,并使用Kotlin编译器插件启用优化。 |
compose.foundation | 使用现成的构建块编写Jetpack Compose应用程序,并扩展基础来构建您自己的设计系统组件。 |
compose.material | 使用现成的Material Design组件构建Jetpack Compose UI。这是Compose更高级别的入口点,旨在提供与www.material.io上描述的组件相匹配的组件。 |
compose.material3 | 使用Material Design 3组件构建Jetpack Compose UI,这是Material Design的下一个演进版本。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.7.5" implementation "androidx.compose.runtime:runtime-livedata:1.7.5" implementation "androidx.compose.runtime:runtime-rxjava2:1.7.5" } android { buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
Kotlin
dependencies { implementation("androidx.compose.runtime:runtime:1.7.5") implementation("androidx.compose.runtime:runtime-livedata:1.7.5") implementation("androidx.compose.runtime:runtime-rxjava2:1.7.5") } 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包含这些提交。
错误修复
- 将依赖项固定到最低支持的稳定版本(即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兼容,支持在应用程序启动时(冷启动)进行组合跟踪,例如在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和公共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.8
版本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)
- 在
Snapshot
中添加了snapshotId
(类型为Long
),并弃用了id
。快照的ID已从Int
更改为Long
,以避免在帧率非常高且动画运行时间长的系统上快照ID溢出。该类型被设为expect/actual,以允许此类型在没有原生Long
类型的平台上为Int
或其他类型。没有原生Long
的平台(如JavaScript)应避免高帧率(超过1000 FPS),这将导致Int
大约每24天溢出一次。(I38ac3,b/374821679)
错误修复
- 修复了单个
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包含这些提交。
错误修复
- 修复将
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
通常用于启动响应组合后发生的事件的协程。在某些情况下,这些事件可能永远不会发生,导致增加了作业创建和取消的成本,而没有任何好处。- 使
rememberCoroutineScope
返回的范围在访问时延迟创建其coroutineContext
,如果从未使用该范围,则完全避免作业创建和取消。
版本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.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
。 - 组合局部变量的值可以通过在计算值的 lambda 内部访问的组合局部变量的
currentValue
属性获取。这用于代替current
,后者仅可在@Composable
函数中访问。(Iadbc0) - 新创建的状态对象及其初始状态可立即从其他快照(包括全局快照)访问。任何后续修改在创建对象的快照应用之前都是不可见的。
mutableStateOf()
的初始状态及其原始版本都是作为参数传递给mutableStateOf()
的值。mutableStateListOf()
和mutableStateMapOf()
的初始状态为空。- 添加了
Snapshot.isInSnapshot
和Snapshot.PreexistingSnapshotId
,用于使状态对象能够在其创建时立即从全局快照访问。 - 自定义状态对象可以通过遵循对内置快照对象所做的更改模式来支持立即访问。(I84a17)
- 为 Compose 库启用
nonSkippingGroupOptimization
。这使得 androidx 中所有不可重启的可组合函数生成的代码更高效。将来我们计划默认启用此功能。(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
。 - 组合局部变量的值可以通过在计算值的 lambda 内部访问的组合局部变量的
currentValue
属性获取。这用于代替current
,后者仅可在@Composable
函数中访问。(Iadbc0)
API更改
- 新创建的状态对象及其初始状态可立即从其他快照(包括全局快照)访问。任何后续修改在创建对象的快照应用之前都是不可见的。
mutableStateOf()
的初始状态及其原始版本都是作为参数传递给mutableStateOf()
的值。mutableStateListOf()
和mutableStateMapOf()
的初始状态为空。- 添加了
Snapshot.isInSnapshot
和Snapshot.PreexistingSnapshotId
,用于使状态对象能够在其创建时立即从全局快照访问。 - 自定义状态对象可以通过遵循对内置快照对象所做的更改模式来支持立即访问。(I84a17)
错误修复
- 修复了嵌套快照中
readObserver
的合并问题。这导致在snapshotFlow
内使用时,嵌套派生状态无效。(Idf138)
1.7.0-alpha06 版本
2024年4月3日
已发布 androidx.compose.runtime:runtime-*:1.7.0-alpha06
版本。1.7.0-alpha06 版本包含这些提交。
错误修复
1.7.0-alpha05 版本
2024年3月20日
已发布 androidx.compose.runtime:runtime-*:1.7.0-alpha05
版本。1.7.0-alpha05 版本包含这些提交。
错误修复
- 清除停用组合中的延迟更改(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 中所有不可重启的可组合函数生成的代码更高效。将来我们计划默认启用此功能。(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 版本包含这些提交。
错误修复
- 在同一帧中使子组合中的可组合 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 版本包含这些提交。
性能优化
错误修复
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 版本包含这些提交。
错误修复
1.6.0 版本
2024年1月24日
已发布 androidx.compose.runtime:runtime-*:1.6.0
版本。1.6.0 版本包含这些提交。
自 1.5.0 版本以来的重要更改
新功能
- 重新抛出在 recomposition 循环期间被吞没的异常 (4dff9a)
性能优化
错误修复
- 修复槽表内存泄漏 (73fcfe)
- 跳过将被删除的子组合的 recomposition。(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)
错误修复
- 在上下文中使用引用策略进行组合局部作用域状态。(83361c)
- 将 $dirty 捕获限制为内联 lambda 表达式。(acfca0)
- 修复可移动内容有时接收错误的组合局部值。(035cd6)
- 在
RecomposeScopeImpl
中使用更快的非分配哈希映射。(d79494) - 在
DerivedState
中使用ObjectIntMap
。(21862e) - 在
DerivedState
中为SnapshotThreadLocal
中的 int 使用IntRef
。(04eaf4)
1.6.0-alpha08 版本
2023 年 10 月 18 日
已发布 androidx.compose.runtime:runtime-*:1.6.0-alpha08
版本。1.6.0-alpha08 版本包含这些提交。
错误修复
- 仅在
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 版本包含这些提交。
新功能
- 重新抛出在 recomposition 循环期间被吞没的异常 (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 版本包含这些提交。
错误修复
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)
错误修复
1.6.0-alpha01 版本
2023 年 6 月 21 日
已发布 androidx.compose.runtime:runtime-*:1.6.0-alpha01
版本。1.6.0-alpha01 版本包含这些提交。
错误修复
- 跳过将被删除的子组合的 recomposition。(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)
错误修复
- 跳过将被删除的子组合的 recomposition。(Ieeb99, b/254645321)
- 不在
ComposerImpl
中保留快照引用 (0206f7) - 避免两次应用组合 (f5791b)
- 确保未初始化的派生状态值的失效 (aa2a92)
- 在组合释放期间调用
onEndChanges
。(62cc8c) - 修复将内容移入子组合的问题 (4beb41)
- 修复潜在的死锁问题 (c1a425 和 8edce0)
- 为Android窗口创建的重组器现在只会阻塞对
withFrameNanos
的调用,而不是在收到ON_STOP通知时阻塞所有组合。这意味着与已停止的活动关联的窗口将继续为数据更改进行重组,但动画或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()
中的fill
,并将其移至关闭位置 (81f9935) - 修复可移动内容移动时缺少失效的问题 (1d7c024)
- 修复已移动可移动内容的立即失效问题 (8676618)
性能改进
- 如果快照未修改,则避免在
DerivedState
中计算readableHash
。(307102) - 减少了内存分配 (I65c09, d7ea77, 727974, 和 445808 )
- 快速取消组合
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 包含这些提交。
错误修复
推迟重新读取派生状态,直到记录更改为止 (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 包含这些提交。
错误修复
- 跳过将被删除的子组合的 recomposition。(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)
错误修复
- 减少了内存分配 (I65c09, d7ea77, 727974, 和 445808 )
- 不在
ComposerImpl
中保留快照引用 (0206f7) - 快速取消组合
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)
错误修复
在组合释放期间调用
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窗口创建的重组器现在只会阻塞对
withFrameNanos
的调用,而不是在收到ON_STOP通知时阻塞所有组合。这意味着与已停止的活动关联的窗口将继续为数据更改进行重组,但动画或withFrameNanos
的任何其他调用者都将被阻塞。(Id9e7f, b/240975572)
错误修复
- 修复快照列表和映射中的潜在死锁问题 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()
中的fill
,并将其移至关闭位置 (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 包含这些提交。
错误修复
修复快照列表和映射中的潜在死锁问题 2eb6570
如果修改与对状态记录的直接写入同时发生,则向
SnapshotStateList
或SnapshotStateMap
添加内容可能会遇到死锁。通过93fcae828b引入的更改使其更容易遇到这种情况,该更改使用直接写入来释放未使用的记录。现在锁的顺序是:当持有映射或列表锁时,绝不会尝试获取快照锁。
版本 1.4.1
2023年4月5日
androidx.compose.runtime:runtime-*:1.4.1
已发布。 版本 1.4.1 包含这些提交。
错误修复
- 修复结束节点组时
endToMarker()
函数的问题。d71d980
1.4.0 版本
2023年3月22日
已发布 androidx.compose.runtime:runtime-*:1.4.0
版本。1.4.0 版本包含以下提交。
自 1.3.0 版本以来的重要更改
- 首次组合时使用来自
LiveData
的初始化值 3680e25 - 添加
ComposeNodeLifecycleCallback
用于观察 Compose 节点的生命周期。8b6a258 - 向
ComposableMethod
添加parameterTypes
属性 7b6c7ad
错误修复和性能改进
- 在
SnapshotStateObserver
中清除两个作用域索引 29f4a3e - 添加不可跳过 lambda 主体中所需的组 7d06752
- 改进 Snapshot 状态的内存引用特性 93fcae8
- 移除组合局部查找中的装箱操作 0875717
- 为不可重用的节点组使用正确的键 6388d8d
- 保护
SnapshotStateObserver
免受递归和并发应用的影响 98cb6ba - 在
IdentityArraySet
的 "get" 方法中添加了边界检查 35a77d3 - 更新 compose 模块以使用
ViewTreeLifecycleOwner
扩展 21c2122 - 在 Recomposer 完成帧后发送应用通知。98f2641
- 修复取消 Recomposer 时出现的索引越界崩溃 8f8656f
- 如果 Composition 的父提供者已更改,则始终强制重新组合 9526fcc
- Recomposer 对已取消作业的容差 a55f7ed
- 改进对大量组合器的失效处理 9b7ed67
- 修复为非局部返回生成结束组的问题 b6f590c
1.4.0-rc01 版本
2023 年 3 月 8 日
已发布 androidx.compose.runtime:runtime-*:1.4.0-rc01
版本。1.4.0-rc01 版本包含以下提交。
错误修复
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) - 添加
@TestOnly
到Composer.disableSourceInformation()
,因为此函数仅在测试中调用才安全。( I896c8)
错误修复
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)
错误修复
- 保护
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)
错误修复
- Snapshot 应用通知现在在
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 版本包含以下提交。
错误修复
- 更新以支持 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 运行时
- 重新设计调用可组合方法的 API
运行时修复
快照系统
- 快照系统在内存管理、性能和正确性方面得到了改进。
- 优化 SnapshotStateObserver 中的作用域移除
- 处理从透明快照创建的嵌套快照
- 修复从全局快照读取状态时的竞争条件
- 在 SnapshotStateObserver 中支持 DerivedState
- 防止在其他作用域中读取派生状态时将其从组合中移除
- 在 DerivedState 中使用 IdentityArrayMap 代替 HashMap
- 更新派生状态观察器以使用可变向量
- 更新 SnapshotStateObserver 状态清理
- 将 SnapshotStateObserver.invalidated 替换为 ArraySet
- 修复从全局快照读取状态时的竞争条件
- 修复在 DerivedState 哈希计算中使用陈旧记录的问题
- 修复推进全局快照时的竞争条件
- 加快 SnapshotStateObserver 中的作用域观察清理速度
1.3.0-rc01 版本
2022 年 10 月 5 日
已发布 androidx.compose.runtime:runtime-*:1.3.0-rc01
版本。1.3.0-rc01 版本包含以下提交。
错误修复
- 修复来自槽表的
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 版本包含以下提交。
错误修复
- 更新的 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 版本包含这些提交。
错误修复
- 修复内存泄漏:处理从透明快照创建的嵌套快照 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 的新调用进入组合,则状态和关联的节点将移动到新调用的位置。如果没有添加新的调用,则状态将永久删除,并通知 remember 观察者。如果在同一组合中多次调用
movableContentOf
lambda,则会为每次调用创建新的状态和节点,并且随着调用离开组合和新的调用进入,状态将按照调用的顺序从第一个离开的调用移动到进入的调用。所有未被新调用占用的状态都将永久删除。除了这个和其他一些新功能外,还花费了大量时间来稳定运行时和快照状态系统。移除了各种内存泄漏并优化了代码路径。
下面是更改的总结列表
1.2 版本中的新功能
- 添加实验性 snapshot unsafeEnter/Leave
- 添加 Snapshot.asContextElement 实验性 API
- 引入 Snapshot.withoutReadObservation
- 允许状态在组合中移动
- Compose 中的重组跟踪
1.2 版本中的性能
1.2 版本中的错误修复
- 从发布重组作用域中删除跟踪信息
- 防止在其他作用域中读取派生状态时将其从组合中移除
- 在 SnapshotStateObserver 中使用更高效的 removeScope()
- 清理组合中派生的状态依赖项
- 修复可移动内容内部重组后 currentCompositeKeyHash 更改的问题
- 在处理过程中清理无效的组合
- 修复重组期间派生状态读取的问题
- 修复观察派生状态对象时的内存泄漏
- 修复可移动内容组合哈希键不一致的问题
- 修复组合器崩溃的一个极端情况
- 确保组的强制失效强制重组
- 修复 rememberSaveable 带输入在错误顺序下恢复的错误
1.2.0-rc03 版本
2022 年 6 月 29 日
已发布 androidx.compose.runtime:runtime-*:1.2.0-rc03
。 1.2.0-rc03 版本包含这些提交。
错误修复
- 以前,派生状态观察会无条件地从重组作用域和组合中一起删除,这会破坏可能仍在观察派生状态的其他作用域。此更改仅在派生状态实例不再被其他作用域观察时才删除它。(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) - 将
recomposeScopeIdentity
添加到 Composer (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 协程 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 的新调用进入组合,则状态和关联的节点将移动到新调用的位置。如果没有添加新的调用,则状态将永久删除,并通知 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 版本包含这些提交。
错误修复
- 修复了
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 的 过度滚动效果
- 改进了触摸目标大小
- 请注意,关于 Compose 1.0,Material 组件将扩展其布局空间以满足 Material 的 辅助功能指南 中关于 触摸目标大小 的要求。例如,即使您将按钮的大小设置为更小,按钮触摸目标也将扩展到至少
48x48dp
的大小。这使 Compose Material 与 Material Design Components 的行为保持一致,如果您混合使用 Views 和 Compose,则可以提供一致的行为。此更改还确保当您使用 Compose Material 组件创建 UI 时,将满足触摸目标辅助功能的最低要求。 - 稳定支持 导航栏
- 将许多以前处于实验阶段的 API 升级到稳定版本
- 支持更新版本的 Kotlin 支持
1.1.0-rc03 版本
2022年1月26日
androidx.compose.runtime:runtime-*:1.1.0-rc03
已发布。1.1.0-rc03 版本包含这些提交。
错误修复
- 更新为支持 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 运行时 (1.0)。在此更改之前,Compose 编译器仅与相同版本或更高版本的 Compose 运行时兼容。此更改后,Compose 编译器与旧版本的 Compose 运行时 (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 版本包含这些提交。
错误修复
- 修复了跟踪 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 中的竞争条件,这些条件会导致零星的 NullPointerException。(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
什么是配置文件规则?
库的配置文件规则在文本文件
baseline-prof.txt
中指定,该文件位于src/main
或等效目录中。该文件每行指定一个规则,此处规则是指用于匹配库中方法或类的模式。这些规则的语法是人类可读的 ART 配置文件格式的超集,该格式在使用adb shell profman --dump-classes-and-methods ...
时使用。这些规则采用两种形式之一来定位方法或类。方法规则将具有以下模式
<FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
类规则将具有以下模式
<CLASS_DESCRIPTOR>
这里
<FLAGS>
是一个或多个字符H
、S
和P
,用于指示是否应将此方法标记为“热”方法、“启动”方法或“启动后”方法。<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 更改,以便能够在单次 recompose 中重新组合更改。(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)
错误修复
- 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)
错误修复
- 来自 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 版包含这些提交。
错误修复
在此更改之前,基于其参数可以跳过局部可组合函数。在此更改之后,将不会跳过任何局部可组合函数。进行此更改是因为局部函数捕获父级参数很常见且预期,跳过它们是错误的常见来源。
总而言之,请考虑以下示例
@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
已弃用。现在,调用withFrameNanos
或Recomposer.runRecomposeAndApplyChanges
且没有MonotonicFrameClock
将抛出IllegalStateException
。(I4eb0d)
1.0.0-beta02 版
2021 年 3 月 10 日
androidx.compose.runtime:runtime-*:1.0.0-beta02
已发布。1.0.0-beta02 版包含这些提交。
错误修复
- 强制执行对实验性 API 的公共使用的限制 (I6aa29,b/174531520)
- 修复了在导航组合的目标内使用
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 构造函数不再接受 key 参数,并且已被弃用。
- 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
相同,但为了保持一致性和进一步的自定义而添加。 - 已从公共 API 表面移除 ElevationDefaults 和 animateElevation(),因为它们不常用/有用。
- 将
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更改
- 已从 UiApplier 中移除对 ViewGroups 的支持。已移除已弃用的 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)现在可以关闭 Recomposers。关闭的 Recomposers 将继续重新组合,直到组合子协程完成。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 现在默认为延迟创建的、窗口范围的 Recomposers,由窗口的 ViewTreeLifecycleOwner 驱动。在主机 Lifecycle 停止时,重新组合和基于 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
,如果从传递给remember
的回调中返回RememberObserver
实例,但在组合状态中未记住该实例,因此将永远不会调用onRemembered
,则会调用此方法。如果异常在完成之前终止组合或由于状态正在为其生成组合不再当前或不再需要而被丢弃,则可能发生这种情况。如果按照上述单一引用建议,RememberObserver
实例正在跟踪外部资源,则onForgotten
和onAbandoned
都表示不再需要该资源。如果对象正在跟踪在onRemembered
中启动的工作或分配的资源,则可以忽略onAbandoned
,因为如果调用了onRemembered
,则不会调用它。( I02c36)不要将
collectAsState()
函数标记为内联函数 (Ia73e4)
错误修复
- 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 中不再可用节点。这通常可以通过将依赖于此类 API 的代码包含在
SideEffect
组合函数中来解决,以便在创建和初始化节点后延迟执行代码。( I018da)
API更改
- 添加了一种跟踪重组器是否已应用更改的方法。(I1b3e2)
扩展[Abstract]ComposeView API 以允许回收基于 Compose 的视图,处置其组合以便稍后重新创建。添加用于安装和发现窗口范围内的 Recomposers 和 CompositionReferences 的 API,用于创建子组合。
添加 ViewCompositionStrategy 用于配置[Abstract]ComposeViews 的组合处置策略;默认行为是在窗口分离时处置。(I860ab)
错误修复
- Recomposer 现在公开其当前状态的 Flow,允许监控其活动及其关联效果的活动。(Ifb2b9)
- 现在可以通过 keyEvent.nativeKeyEvent 访问本机 keyEvent (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 支持可以进行组合调用的属性 getter。对这点的支持不会消失,但是将属性 getter 声明为 @Composable 的语法正在更改。
现在已弃用的语法是通过注释属性本身来实现的。
@Composable val someProperty: Int get() = ...
现在正确的语法是通过注释属性的 getter 来实现的。
val someProperty: Int @Composable get() = ...
两种语法都会在一段时间内有效,但是以前的弃用语法最终将成为编译错误。( Id9197)
错误修复
- 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更改
- 添加了 lint 检查以检查组合 lambda 参数的命名和位置是否与 Compose 指南一致。此外,根据 lint 检查和指南,还将一些使用
children
作为其尾随 lambda 名称的 API 迁移到content
。( Iec48e) - Recomposer 不再接受 EmbeddingContext;所需的调度依赖项是从 effectCoroutineContext 获取的。FrameManager 已弃用;平台集成应初始化其自身的全局快照处理。( I02369)
- RestorableStateHolder.withRestorableState 函数已重命名为 RestorableStateProvider (I66640)
错误修复
- 弃用以
Ambient
作为后缀命名的 Ambients,并用以 Ambient 为前缀的新属性替换它们,遵循其他 Ambients 和 Compose API 指南。( 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)
错误修复
- 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)
- 为 SideEffect 添加了 DisposableEffect 对应 API,它承担了 onCommit-with-params 的角色,但需要 onDispose。
- 添加了 rememberUpdatedState API,用于将数据从重组发布到正在进行的或长期运行的进程,例如 DisposableEffects 或 LaunchedTasks。
- (Id50b9)
- MutableVector 现在实现了 RandomAccess (I85d73, b/170461551)
- 添加了 SideEffect 组合函数,用于将组合的副作用应用于组合管理的对象。SideEffect 用于替换 onCommit 组合函数。( Ia77c2)
- 新的实验性 api RestorableStateHolder。它允许在处置子树之前保存使用 [savedInstanceState] 和 [rememberSavedInstanceState] 定义的状态,以便下次可以使用恢复的状态重新组合它。( I66884, b/166586419)
错误修复
- 在 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)
错误修复
- 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)
错误修复
- 诸如
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更改
- 自定义发射现在可以声明其一个或多个设置器可以跳过并独立于发射进行重新组合。( 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)
错误修复
emitView
已弃用。如果可能,请改用AndroidView
在 Compose 中发射视图。请注意,将来不支持直接组合视图和 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()
的类(例如data
类)可能会看到性能下降,因为默认情况下,现在在分配给mutableStateOf()
时会调用它们的equals()
方法。可以通过向对
mutableStateOf()
、ambientOf()
和savedInstanceStateOf()
的调用添加策略参数policy = referentialEqualityPolicy()
来恢复之前的行为。( Ic21a7)Row
和Column
现在是内联函数,大大减少了使用它们的开销。( I75c10)
错误修复
- 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 } ) }
方法一:使用
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) } ) }
方法二:使用 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
的非可变参数重载已被删除。将来请使用vararg
版本。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
,以避免 Kotlin Compose 所需版本中的问题。一旦 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 的适配器,允许预填充初始值,以便返回的状态是非空的 (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)对 ambients API 的重大更改。有关详细信息,请参阅日志和
Ambient<T>
文档 (I4c7ee, b/143769776)新增了 ui-livedata - 一个带有 LiveData 适配器的全新构件。使用方法示例:val value by liveData.observeAsState() (Ie9e8c, b/150465596)
不带显式初始值的 Rx 适配器已弃用。使用 null 并不总是最佳默认值,例如,如果您有一个 List,最好以 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)
错误修复
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。还重构了颜色、画笔和画笔 drawBackground 实现,以减少代码路径,并取消 Modifier 作为组合部分创建的要求。(I0343a)
- 更新了公开 Canvas 的更高级别组合式 API,以公开 CanvasScope。这样消除了使用者维护自身 Paint 对象的需要。对于仍然需要访问 Canvas 的使用者,他们可以使用 drawCanvas 扩展方法,该方法提供回调以使用底层 Canvas 发出绘图命令。(I80afd)
- WithConstraints 尾随 lambda API 已更改。现在它不是有两个参数,而是有一个接收器作用域,除了约束和布局方向外,它还提供以 Dp 为单位的 minWidth、maxWidth、minHeight 和 maxHeight 属性 (I91b9a, b/149979702)
- 添加了对称填充修饰符。(I39840)
- 更新了 wrapContentWidth 和 wrapContentHeight,以期望垂直或水平 Alignment 而不是任何 Alignment。重力修饰符已更新为接受垂直或水平 Alignment。Row、Column 和 Stack 已更新为支持自定义连续 Alignment。(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,并移除了文本(字符串)重载。有关使用方法信息,请参阅更新后的示例。(If63ab, b/146478620, b/146482131)
runOnIdleCompose
和runOnUiThread
现在是全局函数,而不是 ComposeTestRule 上的方法。(Icbe8f)
外部贡献
- 从 Compose 运行时移植层中删除了不必要的 API,例如 Looper 和 Handler (I6847d)
- 弃用不带初始值的
Flow<T>.collectAsState()
。请改用StateFlow<T>
或传递显式初始值。(I63f98, b/157674865)