用途:这是一个面向 Kotlin / Jetpack Compose 代码审查的技能,用于识别并修正“把派生值另存为独立状态”的反模式,属于代码质量与最佳实践范畴。
主要能力:
- 识别问题模式:一个布尔值是完全由 composable 已收集状态决定的纯函数结果,却被声明为
remember或rememberSaveable { mutableStateOf(...) },并在LaunchedEffect中根据真实来源写入。 - 解释危害:第一,初始猜测值会在首帧渲染,而效果在组合之后才运行,导致冷启动出现“显示—隐藏—显示”三次渲染;第二,仅把种子从 true 改为 false 对已经通过 rememberSaveable 保存旧值的进程无效,因为恢复时会还原旧值而非重跑初始化器。
- 给出正解:改用
remember { derivedStateOf { ... } },让值完全由来源推导,不存在独立写入口,编译器层面保证一致性。 - 指出复制陷阱:同一条形栏可能由平台特定的另一个 composable 携带完全相同的
rememberSaveable+LaunchedEffect组合,只修一处会显得“修复无效”,需全项目搜索。 - 附带提示:可空持有者同时与 null 和空哨兵比较,是持有者应自带哨兵值的信号。
使用方式(资料提供的验证流程):
- 查找形状:用
grep -rn "by rememberSaveable" --include="*.kt" . | grep -v "/build/"定位声明,逐条检查附近是否存在LaunchedEffect向同名变量赋值;只有声明与效果赋值配对才是陷阱,点击处理器赋值属正常用法。 - 冷启动观察一帧:从完全被杀死的进程进入目标界面,若首秒出现“出现—消失—出现”闪烁,即首帧使用了猜测值。
- 热状态验证:在已保存旧种子状态的构建上只修改
mutableStateOf字面量,然后旋转设备,或开启开发者选项“不保留活动”后前后台切换,而非冷重启;若无可见变化,说明种子从来不是问题,状态字段本身才是。
适用场景:Compose 应用的状态管理代码审查、UI 闪烁/首帧错误排查、rememberSaveable 默认值“改了没效果”的疑难定位。
限制:资料仅聚焦布尔派生标志这一具体模式,未提供其他语言或框架的适用性、性能数据或工具集成方式;示例代码为改编片段。