如何观测staticCompositionLocalOf()的重组效果?
验证
staticCompositionLocalOf与compositionLocalOf的重组差异 测试背景与问题
我想要验证staticCompositionLocalOf的重组行为,这符合androids.compose.runtime官方文档的描述:
与
compositionLocalOf不同,staticCompositionLocalOf的读取不会被Composer追踪,修改CompositionLocalProvider提供的值会导致整个内容重组,而非仅使用该本地值的位置。
但实际运行测试代码后,点击按钮时,我预期setContent、Node组件及其内部的Text都会触发重组,但Android Studio的Layer Inspector显示只有Leaf组件及其内部Text发生重组。后续我做了以下调整,结果均无差异:
- 将代码中
staticCompositionLocalOf替换为compositionLocalOf - 改用
counter = mutableStateOf(Counter())并适配LocalCounter的类型
我在多个环境下重复测试,结果一致:
- Android Studio Jellyfish Patch 1 + Pixel 8 API 34模拟器
- Android Studio Koala Canary 2 + Pixel 8 API VanillaIceCream模拟器
- Pixel 4a(API 33)真机
所有测试均使用Kotlin 1.9.24版本。
核心需求
目前相关讨论多聚焦CompositionLocal的基础用法或两者的概念差异,缺少能直观展示两者实际重组行为差异的示例代码。我需要一个可运行的示例,能清晰展示未使用staticCompositionLocalOf提供值的组件,会因该本地值的变化而触发重组。
最终理解与总结
基于Jan Itor的回答调整代码后,我明确了关键前提:只有当CompositionLocal提供的实例本身被替换时,才能观测到staticCompositionLocalOf的预期重组行为。
最终总结两者的适用场景:
- 若
CompositionLocal提供的实例本身很少发生变化,使用staticCompositionLocalOf可避免Composer的追踪开销,提升性能 - 若实例需要频繁被替换,使用
compositionLocalOf可避免未使用该实例的组件发生不必要的重组
内容的提问来源于stack exchange,提问作者Andy Hill
相关产品推荐
相关产品推荐

