用途:当诊断报告(composables.txt / classes.txt)给出不稳定参数清单后,本技能指导如何修复这些类型,策略是严格的三级瀑布,不得颠倒顺序。
主要能力与三级策略:
- 真正稳定:把属性改为 val 且嵌套类型本身稳定,编译器会自动推断,无需注解。
- 注解:源码自有且能遵守契约时,对全 val 且嵌套不可变、equals 为结构性的类型用 @Immutable;值可变但变更由 Snapshot 通知 Compose 的(如持有 MutableState)用 @Stable。@Immutable 优化更强,常量构造可触发静态表达式提升,应优先。
- 第三方或 Java 类型:用 stabilityConfigurationFiles(复数)在根目录建 stability_config.conf 列出类名或通配符,并在 composeCompiler { } 中 stabilityConfigurationFiles.add(...)。旧版单数属性已弃用。
集合处理:将 kotlin.collections.List/Set/Map 换成 kotlinx.collections.immutable 的 ImmutableList/ImmutableSet/ImmutableMap,用 persistentListOf() 等工厂或 toImmutableList() 适配器,优于白名单。
纯 Kotlin 模块:可依赖 androidx.compose.runtime:runtime-annotation(官方推荐)或 com.github.skydoves:compose-stable-marker(旧版),无需完整 compose-runtime。
限制与规则:未遵守契约不得加注解;不得包装 Row/Column/Box 等 inline composable 来“强制”可跳过;不得把 Flow<T> 作为 composable 参数,应在 ViewModel 用 collectAsStateWithLifecycle 上游收集。修复后需重跑诊断验证参数变为 stable 或 runtime。
适用前置:Kotlin 2.0.0+ 并应用 org.jetbrains.kotlin.plugin.compose;第二级注解需相应依赖;第三级需 Compose Compiler 1.5.5+。诊断未完成、问题属于阶段错误或 derivedStateOf、或根因是 Flow 参数时,不适用本技能。