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

Jetpack Compose编译器为何标记含特定ImmutableList参数的可组合函数不稳定?

问题原因分析

核心原因是Compose的稳定性检查依赖于类型及其嵌套属性的递归稳定性,自定义data class在包含ImmutableList类型属性时,编译器无法自动推断其稳定性,进而导致ImmutableList<YourDataClass>整体被标记为不稳定。

详细拆解:

Compose判断一个类型是否稳定的三个核心条件:

  • 类型不可变(所有属性均为val)
  • 所有属性都是稳定类型
  • 泛型类型的所有类型参数都是稳定类型
  1. 第一个案例稳定的原因:
    你通过Gradle配置让Compose编译器识别了kotlinx.collections.immutable.ImmutableList为稳定类型,再加上String本身是基础稳定类型,因此ImmutableList<String>完全满足稳定条件,被标记为stable。

  2. 嵌套ImmutableList后不稳定的原因:
    当YourDataClass的属性是ImmutableList<String>时,虽然这个属性本身是稳定类型,但Compose编译器对自定义data class的稳定性推断存在局限性——对于嵌套了泛型稳定类型的自定义类,无法自动识别其稳定性。此时YourDataClass被判定为不稳定类型,进而导致它作为泛型参数的ImmutableList<YourDataClass>也失去了稳定性。

  3. 属性改为String后恢复稳定的原因:
    String是Compose可以直接识别的基础稳定类型,编译器能轻松推断出YourDataClass满足稳定条件,因此ImmutableList<YourDataClass>也随之成为稳定类型。


解决方法

给YourDataClass显式添加@Stable注解,明确告知编译器该类是稳定的:

import androidx.compose.runtime.Stable

@Stable
data class YourDataClass(
    val data: ImmutableList<String>
)

同时确保你的Gradle配置正确声明了kotlinx.collections.immutable类型的稳定性:

composeCompiler {
    enableStrongSkippingMode = true
    stabilityConfiguration {
        stableClasses.addAll(
            listOf(
                "kotlinx.collections.immutable.ImmutableList",
                "kotlinx.collections.immutable.ImmutableMap",
                "kotlinx.collections.immutable.ImmutableSet"
            )
        )
    }
}

修改后再次检查,YourComposition的state参数会被标记为stable,函数也会恢复skippable状态。

内容的提问来源于stack exchange,提问作者Ting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:12:16