SuperAPI AI 工具集

migrating-to-modifier-node

通用与其它

查看项目

更新于 10-16 00:21

技能介绍

用途:把自定义 Compose Modifier 从旧版 Modifier.composed { } 迁移为 Modifier.Node + ModifierNodeElement<T>,或从零编写新的 Modifier.Node。composed { } 会为每个 modifier 每次组合分配新的 composable 作用域,无法跳过、无法被提升,并迫使父组件在每次重组时运行;Modifier.Node 是持久节点,由 ModifierNodeElement.equals() 做差异比较,首次应用时创建,后续应用就地更新,没有每次重组的分配和父级失效链。

主要能力:

  • 识别模块中所有 Modifier.composed { } 迁移目标(grep Modifier.composed)。
  • 迁移产出三部分:公开扩展函数 fun Modifier.foo(...): Modifier = this then FooElement(...);ModifierNodeElement<T> data class(实现 create() 与 update(node));Modifier.Node 子类(含可变状态与生命周期钩子)。
  • Element 必须是 data class,否则 equals() 用引用相等,diff 失效导致 update() 永不调用。
  • 按需选择专用接口:DrawModifierNode、LayoutModifierNode、SemanticsModifierNode、PointerInputModifierNode、CompositionLocalConsumerModifierNode、LayoutAwareModifierNode、GlobalPositionAwareModifierNode、ObserverModifierNode、DelegatingNode、TraversableNode。
  • 异步使用节点内置 coroutineScope,不自行创建 CoroutineScope。
  • 需要重绘/重测量/重布局时调用 invalidateDraw()、invalidateMeasurement()、invalidatePlacement()。
  • onAttach/onDetach/onReset 处理资源生命周期;onDetach 释放监听与订阅。
  • 多行为用 DelegatingNode 组合小组件节点,避免单节点实现过多接口。
  • 不持有 Composer 或组合作用域对象引用。

使用方式:按工作流找到 composed 工厂,编写扩展、data class Element、Node 子类,选择接口并验证迁移后模块无 composed 残留。

适用场景:旧 composed { } 迁移、新自定义 modifier、需要协程作用域/CompositionLocal/布局绘制/指针输入/坐标跟踪的场景。

限制:需要 Compose UI 1.5+、Kotlin 2.0+ 并应用 compose 插件;单行 composable 包装、内置 modifier 组合或仅需调整链顺序、错误阶段状态读取等不属于本技能范围。