Compose Runtime
androidx.compose.runtime
androidx.compose.runtime.rxjava2
androidx.compose.runtime.rxjava3
androidx.compose.runtime.saveable
androidx.compose.runtime.snapshots
(如需获取所有 Compose 软件包,请参阅 API 参考文档)
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 9 月 4 日 | 1.7.0 | - | - | 1.8.0-alpha01 |
结构
Compose 由 androidx
中的 7 个 Maven 组 ID 构成。每个组都包含一套特定用途的功能,并各有专属的版本说明。
下表介绍了各个组的内容,点击链接即可查看其版本说明。
组 | 说明 |
---|---|
compose.animation | 在 Jetpack Compose 应用中构建动画,丰富用户体验。 |
compose.compiler | 借助 Kotlin 编译器插件,转换 @Composable functions(可组合函数)并启用优化功能。 |
compose.foundation | 使用现成可用的构建块编写 Jetpack Compose 应用,还可扩展 Foundation 以构建您自己的设计系统元素。 |
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 视觉风格和系统界面相得益彰。 |
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" } }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
Runtime Tracing 版本 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 和 tracking-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 兼容,以便在应用启动(冷启动)(例如冷启动)时支持组合跟踪(从 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-alpha01
2024 年 9 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha01
。版本 1.8.0-alpha01 中包含这些提交内容。
版本 1.7
版本 1.7.0
2024 年 9 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.7.0
。版本 1.7.0 中包含这些提交内容。
自 1.6.0 以来的重要变更
- 添加了以下功能:提供根据其他 CompositionLocal 的值计算得出的 CompositionLocal 的值,默认使用
compositionLocalWithComputedDefault()
或通过使用providesComputed
(而非provides
)提供用于计算值的 lambda。 - 若要获取 CompositionLocal 的值,您可以在计算值的 lambda 中使用访问的 CompositionLocal 的
currentValue
属性。这用于替代只能在@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 包含这些提交内容。
新功能
- 添加了以下功能:提供根据其他 CompositionLocal 的值计算得出的 CompositionLocal 的值,默认使用
compositionLocalWithComputedDefault()
或通过使用providesComputed
(而非provides
)提供用于计算值的 lambda。 - 若要获取 CompositionLocal 的值,您可以在计算值的 lambda 中使用访问的 CompositionLocal 的
currentValue
属性。这用于替代current
,后者只能在@Composable
函数中访问。(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)
- 修复了 Composer 中的内存泄漏问题 (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 修复
- 考虑固有特性 remember 中的默认参数元 (096665)
- 使
currentCompoundHashKey
在更多情况下具有唯一性 (d4a872) - 在退出内嵌函数调用时实现组 (2a90fc)
版本 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)
性能优化
- 优化快照状态的记录修改 (28c3fe)
- 优化
rememberSaveable
(f01d79) - 推迟重新读取派生状态,直到记录更改为止 (f38099)
- 改进了提供组合局部值的方法 (a337ea)
bug 修复
- 修复了槽表内存泄漏问题 (73fcfe)
- 跳过重组将要移除的子组合。(Ieeb99、b/254645321)
- 仅当
RememberObserver
生命周期存储在 remember 计算中时才会触发。(f6b4dc) - 将
$dirty
捕获限制为内嵌 lambda。(acfca0) - 修复了可移动内容有时会收到错误的 CompositionLocal 的问题。(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 变更
bug 修复
- 在上下文中对组合局部作用域状态使用参照政策。(83361c)
- 将 $dirty 捕获限制为内嵌 lambda。(acfca0)
- 修复了可移动内容有时会收到错误的 CompositionLocal 的问题。(035cd6)
- 在
RecomposeScopeImpl
中使用更快的非分配哈希映射。(d79494) - 在
DerivedState
中使用ObjectIntMap
。(21862e) - 对
DerivedState
中的整数SnapshotThreadLocal
使用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 窗口创建的 reCompose 在收到 ON_STOP 通知时将仅阻止对
withFrameNanos
的调用,而不是所有组合。这意味着,与已停止的 activity 相关联的窗口会因数据更改而继续重组,但动画或withFrameNanos
的任何其他调用方会阻塞。(Id9e7f、b/240975572) - 在处理效果之前,对
LayoutNode
执行停用回调 3784073 - 修复了重启的 lambda 的标志已更改的问题 ea81df9
- 修复了具有节点 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)
- 快速取消 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 窗口创建的 reCompose 在收到 ON_STOP 通知时将仅阻止对
withFrameNanos
的调用,而不是所有组合。这意味着,与已停止的 activity 相关联的窗口会因数据更改而继续重组,但动画或withFrameNanos
的任何其他调用方会阻塞。(Id9e7f、b/240975572)
bug 修复
- 修复了快照列表和映射 5c1a425 中的潜在死锁问题
- 在处理效果之前,对
LayoutNode
执行停用回调 3784073 - 修复了重启的 lambda 的标志已更改的问题 ea81df9
- 修复了具有节点 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)
修复了一些 bug、提升了性能
- 使用无法访问的状态记录覆盖状态对象的记录 (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) - 通过实现
CompositionLocalConsumerModifierNode
接口允许Modifier.Nodes
读取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
,用于观察 Compose 节点的生命周期。8b6a258 - 将
parameterTypes
属性添加到ComposableMethod
7b6c7ad
问题修复和性能提升
- 清除
SnapshotStateObserver
29f4a3e 中的两个范围索引 - 在不可跳过的 lambda 的正文中添加所需的组 7d06752
- 改进了快照状态 93fcae8 的内存引用特性
- 移除了组合本地查询中的方框 0875717
- 为不可重复使用的节点组使用正确的密钥 6388d8d
- 防止
SnapshotStateObserver
出现递归和并发错误,应用 98cb6ba - 在
IdentityArraySet
“get”中添加了 check-index-bounds 检查方法 35a77d3 - 更新 Compose 模块以使用
ViewTreeLifecycleOwner
扩展程序 21c2122 - 在 Re Composer 完成帧后发送应用通知。98f2641
- 修复了取消 Recomposer 8f8656f 时索引出界崩溃的问题
- 如果组合的父级提供程序已更改 9526fcc,则始终强制重组
- 已取消作业 a55f7ed 的 ReCompose 公差
- 改进了处理大量编辑器的失效操作 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 变更
- 内嵌/已废弃的隐藏函数的更多类型/可为 null 性 (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
- 修复了从全局快照读取状态时的竞态条件问题
- 修复了在 DerivedState 哈希计算中使用过时记录的问题
- 修复了推进全局快照时的竞态条件问题
- 在 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 修复
- 修复了内存泄漏的问题:处置通过透明快照创建的嵌套快照(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 中引入的一些功能,以及诸多用于进行稳定处理的 bug 修复。其中最重要的一项新功能是引入了
movableContentOf
API,该 API 可用于实现复杂的用户体验,例如共享元素过渡。movableContentOf
API 用于将可组合 lambda 转换为另一种 lambda,后者会将其状态以及相应的节点移至其被调用的任何新位置。当上一个调用退出组合时,相应状态会暂时保留,如果对 lambda 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。如果在同一个组合中多次调用
movableContentOf
lambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。除了这项功能和一些其他新功能之外,我们还花费了大量时间来让运行时和快照状态系统保持稳定。移除了各种内存泄漏并优化了代码路径。
下面总结了这些更改:
1.2
的新功能
- 添加了实验性快照 unsafeEnter/Leave
- 添加了 Snapshot.asContextElement 实验性 API
- 引入了 Snapshot.withoutReadObservation
- 允许状态在组合内移动
- 在 Compose 中跟踪重组
1.2
的性能
1.2
中的 bug 修复
- 从版本重组作用域中移除了跟踪信息
- 防止在从其他作用域中读取派生状态时将其从组合中移除
- 在 SnapshotStateObserver 中使用更高效的 removeScope()
- 清理了组合中的派生状态依赖项
- 修复了在可移动内容内进行内部重组后 currentCompositeKeyHash 发生变化的问题
- 在处理过程中清理无效的组合
- 修复了在重组过程中读取的派生状态问题
- 修复了观察派生状态对象时的内存泄漏问题
- 修复了 movableContent 复合哈希键,使其保持一致
- 修复了极端情况下合成器会崩溃的问题
- 确保使某个组强制失效会强制执行重组
- 修复了以错误顺序恢复带有输入的 rememberSaveable 时的 bug
版本 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) - 现在可以使用
@file
前缀在文件范围内使用@ComposableTarget
注解和标有@ComposableTargetMarker
的注解。在文件范围内使用目标注解将使编译器假定文件中的所有可组合函数都要以关联的 Applier 为目标。例如,使用@file:UiComposable
即会声明所有@Composable
函数均以 Compose 界面 Applier 为目标。如果某个函数需要以其他 Applier 为目标,则必须为所需 Applier 明确提供目标标记注解。(I40804)
版本 1.2.0-alpha08
2022 年 4 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha08
。版本 1.2.0-alpha08 中包含这些提交内容。
API 变更
- 向
CompositionTracer
接口添加了TracingInProgress
。(Ic6f12) - 向 Composer 添加了
recomposeScopeIdentity
(I0c873) - 限制了对
OptIn(InternalComposeTracingApi)
的跟踪 API (Composer.setTracer)。(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
,以便系统在编译时报告何时以预期使用范围外的 Applier 为目标而调用了某个可组合函数。在大多数情况下,注解可以由 Compose 编译器插件推断出来,因此直接使用这些注解的情况应该很少。无法推断的情况包括创建和使用自定义 applier、抽象可组合函数(例如接口方法)、可组合 lambda 性质的字段或全局变量(推断出局部变量和参数),或者使用
ComposeNode
或相关可组合函数的情况。对于自定义 Applier,调用
ComposeNode
或ReusableComposeNode
的可组合函数需要为该函数和任何可组合 lambda 的参数类型添加CompoableTarget
注解。不过,建议您创建一个带有ComposableTargetMarker
的注解,然后使用带标记的注解,而不是直接使用ComposableTarget
。标有ComposableTargetMarker
的可组合注解等同于用属性类的完全限定名称作为 applier 参数的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 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。如果在同一个组合中多次调用
movableContentOf
lambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。(Ib4850)为组合添加了跟踪 API,以便工具能够提供更详细的可组合函数跟踪记录。现在,编译器会生成对包含来源信息的跟踪 API 的调用。(Ib0eb5)
如需从发布 build 中移除这些调用以及关联的来源信息,请添加以下 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 滚动效果提供稳定支持
- 改进了触摸目标大小调整
- 请注意,对于 Compose 1.0,Material 组件将扩展其布局空间,以符合 Material 无障碍功能指南对触摸目标尺寸的要求。例如,按钮触摸目标将扩展为至少
48x48dp
的尺寸,即使您将按钮尺寸设为更小也不影响。这会使 Compose Material 与 Material Design 组件的行为保持一致,以便在混合使用 View 和 Compose 时提供一致的行为。此变更还可确保在您使用 Compose Material 组件创建界面时,能够满足触摸目标无障碍功能的最低要求。 - 对导航栏提供稳定支持
- 将之前的一些实验性 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 Compiler 现在支持较低版本的 Compose Runtime (1.0)。在此变更之前,Compose Compiler 仅与相同版本或更高版本的 Compose Runtime 兼容。此变更生效后,Compose Compiler 可与较低版本的 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 中的竞态条件导致系统偶尔抛出 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
什么是配置文件规则?
库的配置文件规则是在位于
src/main
或等效目录内的文本文件baseline-prof.txt
中指定的。该文件会每行指定一个规则,在此情况下,规则是指用于与库中的方法或类匹配的格式。这些规则的语法是使用adb shell profman --dump-classes-and-methods ...
时所用的便于用户看懂的 ART 配置文件格式的超集。这些规则采用两种形式,一种用于方法,一种用于类。方法规则采用以下格式:
<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
标志,则表示该方法为“hot”方法,应提前进行编译。如果某个方法具有
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,这些 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 修复
在此变更之前,本地可组合函数可根据其参数而跳过。此更改生效后,系统不会再跳过任何本地可组合函数。之所以会有这项变更,是因为在通常情况下,本地函数会从父函数获取参数,而跳过本地函数是出现 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)
- 修复了
rememberSaveable { mutableStateOf(0) }
在 navigation-compose 的目标内使用时损坏的问题。(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 的类型(不提供默认出厂设置)可能存在的类型错误。之前,此操作会为不可为 null 的类型提供 null 引用值。
对于可为 null 的类型,请考虑提供
{ null }
作为默认出厂设置。除非可提供合理的默认设置,否则我们不建议使用具有不可为 null 的类型的本地设置。如果不存在合理的默认设置,则
defaultFactory
lambda 应抛出异常。不过,抛出异常意味着本地设置的使用者将隐式依赖于相关设置是以类型系统不强制执行该设置为前提的。(Ifbd2a)从 Comepose 运行时中移除了已废弃的符号 (I3252c)
移除了已废弃的
emptyContent()
。已改用{}
。(Idb33f、b/179432510)已将 Provider 重命名为 CompositionLocalProvider
- Composition 构造函数不再接受键参数,并已废弃。
- currentCompositeKeyHash 已变为可组合的顶级属性,而不是可组合的顶级函数。
- CompositionData 和 CompositionGroup 已移至 androidx.compose.runtime.tooling 命名空间
- ComposableLambda 已成为接口,而不再是具体的类,也不再包含类型参数。
- ComposableLambdaN 已成为接口,而不再是具体的类,也不再包含类型参数。
- snapshotFlow 函数已移至 androidx.compose.runtime 命名空间
- SnapshotMutationPolicy 的合并方法不再是实验性方法
- 移除了 @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 Surface 中移除了 ElevationDefaults 和 animateElevation(),因为它们不常用/不实用。
- 将
Slider
中的onValueChangeEnd
重命名为了onValueChangeFinished
,并使其可为 null。 - 将
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 移除了对 ViewGroup 的支持。移除了废弃的 emitView 可组合项。(Ifb214)
- CompositionReference 已重命名为 CompositionContext (I53fcb)
- ComponentActivity.setContent 已移至 androidx.activity:activity-compose 模块中的 androidx.activity.compose.setContent。(Icf416)
- 更新了 Snapshot API 以使其更加符合 API 指南,并在公共 API 中隐藏了内部实现类。(Id9e32)
- 已重命名 Ambient,以与 Ambient 重命名为 CompositionLocal 匹配。Ambient 过去被命名为 AmbientFoo,现在 CompositionLocal 被命名为 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 的动画 tick 操作。(I38e11)
Recomposer.runningRecomposers 现在提供只读 RecomposerInfo 的一个全局 StateFlow,用于观察进程中正在进行的组合状态。请首选此 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 API 和 DisposableEffect API (If760e)
- emit() API 和所有重载均已废弃并重命名为 ComposeNode。这些 API 是一样的,只不过为了遵循 Compose 的命名惯例而采用了不同的名称 (I4137b)
- invalidate 和 compositionReference() 现已废弃,取而代之的分别是 currentRecomposeScope 和 rememberCompositionReference。(I583a8)
CompositionLifecycleObserver 现已废弃,取而代之的是 RememberObserver。
RememberObserver
已替代CompositionLifecycleObserver
,且语义和方法名称也已改变。始终推荐的做法是,对那些只记住一次的对象,可以机械地更改为新的 API。不过,如果引用在组合中被记住不止一次,那么对于只调用onRemembered
一次的每个引用,都会调用onEnter
。如果将onEnter
用于WithConstraints
和Scaffold
等子组合,则会多次调用该对象,从而打破单次调用onEnter
的保证,而对于RememberObserver
已将该对象移除。RememberObserver
添加了在以下情况下会被调用的onAbandoned
:如果从传递到remember
的回调中返回RememberObserver
实例,但该实例在组合状态下不被记住,并因此永远不会调用onRemembered
。当异常导致组合在完成前终止,或者组合因以下两种原因而遭到舍弃时就会发生上述情况:组合因不再是最新的而处于正在生成状态或者组合不再被需要。如果遵循上述单一引用建议的RememberObserver
实例跟踪的是外部资源,那么onForgotten
和onAbandoned
都会表示不再需要该资源。如果该对象跟踪的是onRemembered
中已开始的工作或已分配的资源,则可以忽略onAbandoned
,因为如果调用onRemembered
,就不会调用 onAbandoned。(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 和实验性 API 提供节点。通常可如下解决此问题:将具有此类依赖项的代码封装在
SideEffect
可组合项中,从而将代码的执行推迟到节点创建和初始化之后。(I018da)
API 变更
- 添加了在 Recomposer 已应用更改的情况下进行跟踪的方式。(I1b3e2)
扩展了 [Abstract]ComposeView API 以允许回收基于 Compose 的视图,处理其组合以便日后重新创建。添加了用于安装和发现作用域为窗口的 Recomposer 的 API 和用于创建子组合的 CompositionReference。
添加了 ViewCompositionStrategy,用于配置 [Abstract]ComposeView 的组合处理策略;默认行为是在窗口分离时进行处理。(I860ab)
bug 修复
- Recomposer 现在提供其当前状态的 Flow,因此可监控其 activity 和相关效果的 activity。(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。这些 API 以前被标记为 InternalComposeAPI,现已变成 Compose 模块的内部 API。
添加了 CompositionData 和 CompositionGroup,用于替代 ui-tooling API 来提取组合信息。CompositionData 和 CompositionGroup 是公开的,但不能在 ui-tooling API 之外使用,因为它们会提供 ui-tooling API 解译的原生信息 (I31a9c)
不再将 Applier 类视为实验性 API (Id85b0)
更改了
Applier
接口,简化了将树的构建方式从自上而下改为自下而上的过程。insert()
方法已重命名为insertTopDown()
。添加了新方法
insertBottomUp()
。applier 可以使用
insertTopDown()
或insertBottomUp()
向正修改的树中插入节点,具体取决于哪个方法的效果更好。在构建某些树(例如
LayoutNode
和View
)时,自下而上构建会比自上而下构建效率更高。在做出此变更之前,若想实现自下而上构建,要进行很多插入操作,并需将插入内容复制到需借助自下而上的构建方式来提高性能的每个 applier。通过此变更,Applier
替换insertBottomUp()
即可实现自下而上构建树,替换insertTopDown()
即可实现自上而下构建树。(Icbdc2)Compose 支持可进行可组合调用的属性 getter。系统不会停止支持此类 getter,但将某个属性 getter 声明为 @Composable 的语法会不断变化。
要采用现已废弃的语法进行此声明,需对属性本身进行注解:
@Composable val someProperty: Int get() = ...
若要采用目前正确的语法进行此声明,需对属性的 getter 进行注解:
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 检查结果和指南,还将一些尾随 lambda 名为
children
的 API 迁移到了content
。(Iec48e) - Recomposer 不再接受 EmbeddingContext;系统会从 effectCoroutineContext 中获取所需的调度依赖项。废弃了 FrameManager;平台在进行集成时应初始化其自己的全局快照处理操作。(I02369)
- RestorableStateHolder.withRestorableState 函数已重命名为 RestorableStateProvider (I66640)
bug 修复
- 废弃了名称后缀为
Ambient
的 Ambient 属性,将它们替换成了以 Ambient 为前缀的新属性(以与其他 Ambient 属性保持一致并遵循 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,用作提供上下文环境的替代方案,可用于指定只会在尚未提供上下文环境值时设置的上下文环境值。(Id6635、b/171024925)
- LaunchedTask 已重命名为 LaunchedEffect,以与 SideEffect 和 DisposableEffect API 保持一致。为了鼓励采用最佳实践,不允许使用不含主题参数的 LaunchedEffect。(Ifd3d4)
- Applier 现在包含 onBeginChanges/onEndChanges 回调,可在 Composer 开始/结束将更改应用到树时调用。您可根据需要将这些回调用于资源的批量管理。(Icf476)
- 现在,Recomposer 在构造时需要使用 CoroutineContext (Ic4610)
- 对不应影响公共 API 的内部 SlotTable 实现进行了更改。(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)
- 添加了与 SideEffect 对应的 DisposableEffect API,用于填充 onCommit-with-params 角色,但需要一个必需的 onDispose。
- 添加了 rememberUpdatedState API,以将数据从重组发布到持续进行或长期存在的进程(例如 DisposableEffect 或 LaunchedTask)。
- (Id50b9)
- MutableVector 现已实现 RandomAccess(I85d73、b/170461551)
- 添加了 SideEffect 可组合项,用于将组合的附带效应应用到其管理的对象。SideEffect 旨在取代 onCommit 可组合项。(Ia77c2)
- 新增了实验性 API RestorableStateHolder。通过该 API,可先为子树保存定义为 [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)
- 通过减少每次滚动时 subcomposition 中的工作量,改善了 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,分别用于使用和生成快照数据更改。(I3e722) 可组合函数的调用规范发生了变化。这是一项重大的二进制文件更改。所有库都必须重新编译才能使用此版本的 Compose 编译器插件。
这项更改不会在源代码级别产生重大变化,因为只有已更改的 API 属于明确选择启用的编译器 API。(I7afd2、b/158123185)
从 EmbeddingContext 中移除了调度方法 (I7b9be)
废弃了 onPreCommit;onCommit 的功用现在与 onPreCommit 相同。
现在,onCommit 和 onActive 在已提交的组成部分变更的同一 Choreographer 帧中运行,而不是在下一个 Choreographer 帧开始处运行。(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 变更
- 自定义 emit 现在可以做如下声明:可以跳过它的一个或多个 setter,并且可以独立于 emit 对 setter 进行重新组合。(Ibbd13)
移除了已废弃的 FrameManager 调用。
更改了内部 Compose API,从而降低了跟踪状态对象(如
mutableStateof()
)所需的开销 (I80ba6)为清楚起见,现已废弃
state { ... }
可组合项,取而代之的是对remember { mutableStateOf(...) }
的显式调用。这样可减少管理状态所需的整体 API Surface 及概念数量,且与类属性委托的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。请注意,今后将不再支持直接对 View 和 ViewGroup 进行组合,除非二者是组合树的分支(在这种情况下,可通过 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
类)可能会出现性能下降,因为现在系统默认会在将其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 Surface 区域和我们需要传授的概念
- 更为贴近其他类似工具包(Swift UI、React、Flutter)
- 这是一项可撤消的决定。我们以后可以随时恢复
@Model
。 - 解决了极端情况下的使用难题,轻松回答了有关将
@Model
配置为我们需要处理的内容的问题 @Model
数据类、等号、哈希代码等。- 如何让部分属性“被观测”,而其他属性不被观测?
- 如何指定要在观测中使用的结构性与指示性等式?
- 减少系统中的“魔力”。这会降低有人误认为系统比实际上要更智能(即知道如何区分列表)的可能性
- 使观测的粒度更为直观。
- 改进了类中从变量到属性的可重构性
- 可能使您可以手动进行针对特定状态的优化
- 与生态系统的其他部分更加贴近,并减少了在不可变性或我们“接受可变状态”方面的不确定性
迁移注意事项
@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 个参数的函数,其他参数为合成器,即“键”整数,一个用于通过调用传播元数据的位掩码整数。
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
,以避免 Compose 所需的 Kotlin 版本出现问题。一旦 Compose 更新到不存在问题的 Kotlin 版本,就会重新引入这些接口。SnapshotStateList
和SnapshotStateMap
现已公开,但恢复StableMutableList
和StableMutableMap
后就会将其废弃。(Ia7769)添加了顶级 onFrameNanos 函数用于动画定时 (Ie34c5)
已废弃 @Untracked 注解,替换为 @ComposableContract(tracked=false) (Id211e)
RestartableFunction 和关联的 API 已重命名为 ComposableLambda 等。因为只有编译器定位到这些 API,所以此变更在正常情况下应该不会影响源代码级别的兼容性。重命名的主要目的是,当这个类出现在堆栈轨迹中时,用户能够更清晰地了解这个类 (I7eb25)
@Composable 注解对类不再有效 (Ia5f02)
Ambient<T>
现在带有 @Stable 注解而不是 @Immutable 注解 (I0b4bb)在此变更之前,如果存在 @Composable 函数,Compose 编译器插件会以非常复杂的方式拦截对该函数内构造函数的调用(I5205a、b/158123804)
Recompose 可组合项已不再属于有效抽象。大多数重新组合都应由 MutableState 分配促成。在此之外,建议您使用
invalidate
函数来触发对当前范围的重新组合。(Ifc992)Observe 已不再属于有效抽象函数。如需对其进行复制,只需创建一个执行可组合 lambda 参数的可组合函数即可复制其实现。例如,
@Composable fun Observe(body: @Composable () -> Unit) = body()
(I40d37)废弃了 @Direct,取而代之的是 @ComposableContract(restartable=false) (If4708)
为最近引入的 StateFlow 添加了一个适配器,可用于预先填充初始值,使返回的 State 不可为 null(I61dd8、b/156233789)
为 Flow 添加了一个适配器。用法示例:val value by flow.collectAsState()(If2198、b/153375923)
[Mutable]State 属性委托运算符移到了扩展,以支持 Kotlin 1.4 属性委托优化。调用方必须添加 import 才能继续使用
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 作为默认值并不一定是最佳选择,以 List 为例,最好是以 emptyList() 开头(I00025、b/161348384)
添加了 ui-rxjava2 - 带适用于 RxJava2 的适配器的新制品。用法示例:val value by observable.subscribeAsState()(Ifab4b、b/153369097)
savedInstanceState()
现在可以与可为 null 的类型一起使用(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,改为在修饰符上使用 drawBackground 扩展 API。重构了颜色、笔刷和涂料 drawBackground 实现,以减少代码路径,并且不再要求在组合过程中创建修饰符。(I0343a)
- 更新了公开画布的更高级别的 Compose API,改为公开 CanvasScope。这样一来,用户便无需再维护自己的渲染对象。对于仍需要访问画布的使用方,可以使用 drawCanvas 扩展程序方法,该方法提供回调以向底层画布发出绘制命令。(I80afd)
- withConstraints 尾随 lambda API 已更改。现在,它不是使用两个参数而是使用一个接收器作用域,除了 constraints 和 layoutDirection 之外,还以 Dp 为单位提供 minWidth、maxWidth、minHeight 和 maxHeight 属性(I91b9a、b/149979702)
- 新增了对称内边距修饰符。(I39840)
- 更新了 wrapContentWidth 和 wrapContentHeight,预计会显示垂直或水平 Alignment,而不是任意 Alignment。Gravity 修饰符已更新为接受垂直或水平 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) - 将修饰符以及运算符替换成了出厂扩展函数 (I225e4)
- 现在可以在 Row 和 Column 之外访问 RowScope 和 ColumnScope 成员。(I3a641)
- LayoutFlexible 已重命名为 LayoutWeight。“tight”参数已重命名为“fill”。(If4738)
- WithConstraints 获取了 LayoutDirection 参数 (I6d6f7)
- 已将 background 重命名为 DrawBackground 并设置为默认记住 (Ia0bd3)
- 将 ButtonStyle 替换成了不同的函数,并移除了文本(字符串)重载。如需了解使用信息,请参阅更新后的示例。(If63ab、b/146478620、b/146482131)
runOnIdleCompose
和runOnUiThread
现在是全局函数,而不是 ComposeTestRule 上的方法。(Icbe8f)
外部贡献
- 从 Compose 运行时移植层移除了 Looper 和 Handler 等不需要的 API (I6847d)
- 废弃了没有初始值的
Flow<T>.collectAsState()
,改为使用StateFlow<T>
或传递明确的初始值。(I63f98、b/157674865)