SuperAPI AI 工具集

derive-the-flag-dont-store-and-correct-it

编程与开发

查看项目

更新于 10-17 16:15

技能介绍

用途:这是一个面向 Kotlin / Jetpack Compose 代码审查的技能,用于识别并修正“把派生值另存为独立状态”的反模式,属于代码质量与最佳实践范畴。

主要能力:

  1. 识别问题模式:一个布尔值是完全由 composable 已收集状态决定的纯函数结果,却被声明为 remember 或 rememberSaveable { mutableStateOf(...) },并在 LaunchedEffect 中根据真实来源写入。
  2. 解释危害:第一,初始猜测值会在首帧渲染,而效果在组合之后才运行,导致冷启动出现“显示—隐藏—显示”三次渲染;第二,仅把种子从 true 改为 false 对已经通过 rememberSaveable 保存旧值的进程无效,因为恢复时会还原旧值而非重跑初始化器。
  3. 给出正解:改用 remember { derivedStateOf { ... } },让值完全由来源推导,不存在独立写入口,编译器层面保证一致性。
  4. 指出复制陷阱:同一条形栏可能由平台特定的另一个 composable 携带完全相同的 rememberSaveable + LaunchedEffect 组合,只修一处会显得“修复无效”,需全项目搜索。
  5. 附带提示:可空持有者同时与 null 和空哨兵比较,是持有者应自带哨兵值的信号。

使用方式(资料提供的验证流程):

  • 查找形状:用 grep -rn "by rememberSaveable" --include="*.kt" . | grep -v "/build/" 定位声明,逐条检查附近是否存在 LaunchedEffect 向同名变量赋值;只有声明与效果赋值配对才是陷阱,点击处理器赋值属正常用法。
  • 冷启动观察一帧:从完全被杀死的进程进入目标界面,若首秒出现“出现—消失—出现”闪烁,即首帧使用了猜测值。
  • 热状态验证:在已保存旧种子状态的构建上只修改 mutableStateOf 字面量,然后旋转设备,或开启开发者选项“不保留活动”后前后台切换,而非冷重启;若无可见变化,说明种子从来不是问题,状态字段本身才是。

适用场景:Compose 应用的状态管理代码审查、UI 闪烁/首帧错误排查、rememberSaveable 默认值“改了没效果”的疑难定位。

限制:资料仅聚焦布尔派生标志这一具体模式,未提供其他语言或框架的适用性、性能数据或工具集成方式;示例代码为改编片段。