智能手势命中了已经离屏的按钮:HarmonyOS 7 节点可见性、复用和动作门禁怎么验
列表里的按钮滑出屏幕后,智能手势仍触发了它;再滑回来,动作又落到复用后的另一条数据。节点注册、列表复用和业务数据如果没有同一身份,视觉上“指向这个按钮”不代表回调拿到的还是这个按钮。手势入口必须在执行前重新核对可见性与业务身份。
验证范围:官方页面用于确认 HarmonyOS 7/API 26 的能力方向;文章代码只验证应用侧状态、预算或一致性模型。当前电脑是 API 24 SDK,且没有连接 HarmonyOS 7 真机,所以下面的断言不是 API 26 编译、设备性能或线上效果证明。
用列表复用稳定重现误触
创建可复用长列表,为每个按钮登记智能手势。选中某项后快速滚动,让节点被复用,再触发动作。记录节点 key、数据 itemId、可见比例和当前页面 generation。
案例一:删除按钮必须重新确认业务身份
危险动作不能只使用节点创建时捕获的索引。执行前按 itemId 查询当前数据,确认节点仍可见且目标未变化,再显示确认。
案例二:播放按钮可在短暂离屏时降级
媒体卡片刚离开边缘时可以保留选中反馈,但真正播放前仍校验当前页面与资源 ID;完全离屏则拒绝并提示重新选择。
可选择不代表可执行
虚拟列表会复用组件实例,索引和节点对象都可能对应新的业务项。enabled、selectable与应用能否安全执行是不同条件。
typeActionSnapshot={nodeKey:string;itemId:string;visible:number;generation:number};functioncanRun(s:ActionSnapshot,currentGeneration:number,currentItem:string){returns.generation===currentGeneration&&s.itemId===currentItem&&s.visible>=.5;}if(canRun({nodeKey:'n1',itemId:'old',visible:.8,generation:2},2,'new'))thrownewError('复用节点误触');这段模型用确定输入验证“手势执行前同时核对页面代际、业务身份和可见比例”。它适合先发现边界错误,但不会冒充平台接口或设备性能测试。
执行前需要哪三道门
| 方案 | 适用范围 | 主要风险 |
|---|---|---|
| 只看节点 enabled | 静态页面 | 列表复用会错目标 |
| 离屏即全部注销 | 短列表 | 频繁注册带来抖动 |
| 动作前快照校验 | 虚拟列表 | 需要稳定业务 ID |
保留平台节点注册,但应用执行前用快照校验。危险动作增加确认;可恢复动作可以提示重新选择。
封装动作快照
建立GestureActionGate,所有手势动作统一提交节点 key、itemId、可见性和页面 generation。鼠标、触控和键盘也可共享同一业务门禁。
不同输入方式必须等价验收
- 节点复用后 itemId 会更新。
- 完全离屏节点不能执行危险动作。
- enabled 和 selectable 分别测试。
- 手势与触控命中同一业务项。
- 滚动、筛选和页面重建都覆盖。
智能手势越自然,误触成本越高。把视觉命中转换成稳定业务身份,再执行动作,才能让新入口和原有交互一样可靠。
官方资料
- HarmonyOS 7 新能力
- HarmonyOS 设计资源
- HarmonyOS 应用开发指南