Jetpack Compose中isSystemInDarkTheme()触发重组的原因
isSystemInDarkTheme()触发重组的核心原因 Compose 的重组触发机制遵循明确规则:只有可组合函数内部读取了被Compose运行时追踪的State对象时,该可组合项才会在对应State值变化时触发重组。
isSystemInDarkTheme()本身不是无状态的普通工具方法,它的内部实现会读取CompositionLocal中存储的全局主题配置State:
- 这个主题State是Compose视图树挂载时随上下文注入的,它的首次值校准会在初始组合流程完成后执行一次更新
- 只要可组合项内部调用了
isSystemInDarkTheme(),就相当于订阅了这个主题State的变化
对应代码里的数值差异解释
- 移除
isSystemInDarkTheme()调用时:test()函数没有订阅任何可追踪的State,仅在页面首次加载时执行1次初始组合,Holder.a从0自增为1,Text最终显示1,后续无State变化不会触发额外重组。 - 保留
isSystemInDarkTheme()调用时:- 第一次执行初始组合,此时主题State还未完成首次值同步,
Holder.a第一次自增为1 - 初始组合完成后,主题State完成初始化赋值,因为
test()订阅了这个State,会被Compose运行时标记为待重组,随即触发第二次重组 - 第二次重组执行时
Holder.a再次自增为2,最终Text显示数值2
- 第一次执行初始组合,此时主题State还未完成首次值同步,
注意:不要直接在可组合函数的主体逻辑里写修改变量、计数这类副作用代码。Compose的重组是乐观执行的,可能跳过、重复执行或者按任意顺序执行,写在组合主体里的副作用会出现完全不可预期的结果。这类需要在组合过程中执行的操作,必须放在
SideEffect、LaunchedEffect等专门的副作用API中,才能保证执行时机符合预期。
内容的提问来源于stack exchange,提问作者Tim Hu
相关产品推荐
相关产品推荐

