You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何观测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:09