HarmonyOS 7 自动填充总落到旧输入框?PageNodeInfo 的 id、rect 和 isFocus 怎么同步

界面上的焦点已经移动,自动填充值却仍落到旧输入框。这类问题不能只看 isFocus,因为 PageNodeInfo 的 id、rect、value 和焦点共同描述同一时刻的节点快照。只更新一个字段,系统看到的就是互相矛盾的数据。

PageNodeInfo 节点身份、矩形与焦点快照

先确认 API 26 的能力边界

PageNodeInfo 从 API 26 开始提供并用于 Stage 模型。id、autoFillType、value、rect 和 isFocus 是必需信息。工程侧还需要保证同一快照内 id 唯一、焦点唯一、rect 属于当前窗口代次。

  • id 应按业务字段稳定映射,不能直接使用数组下标。
  • 同一批快照最多一个节点 isFocus=true。
  • 异步测量结果需要代际号,旧回调不能覆盖新布局。

案例一:切换登录方式后,新邮箱框复用了旧手机号 id

按数组下标生成 id 时,字段重排会让新节点继承旧身份。正确做法是在一次表单会话中按业务键分配稳定 id。

class StableNodeIds {
  private next = 1
  private ids = new Map<string, number>()
  get(key: string): number {
    const old = this.ids.get(key)
    if (old !== undefined) return old
    const id = this.next++; this.ids.set(key, id); return id
  }
}
const ids = new StableNodeIds()
console.assert(ids.get('login.phone') === ids.get('login.phone'))
console.assert(ids.get('login.phone') !== ids.get('login.email'))

同一字段在会话内保持身份,不同字段即使占据相同数组位置也不会互相污染。

案例二:焦点切换中间态出现两个 isFocus=true

新输入框先获焦、旧输入框稍后失焦时,分散更新会产生短暂双焦点。快照出口应使用唯一 activeId 统一计算。

interface NodeState { id: number; isFocus: boolean; generation: number }
function normalize(nodes: NodeState[], activeId?: number): NodeState[] {
  return nodes.map(node => ({ ...node, isFocus: activeId !== undefined && node.id === activeId }))
}
const result = normalize([{ id: 1, isFocus: true, generation: 2 }, { id: 2, isFocus: true, generation: 2 }], 2)
console.assert(result.filter(item => item.isFocus).length === 1)
console.assert(result[1].isFocus)

归一化后每批快照只有一个焦点,自动填充目标不再依赖两个状态更新的先后顺序。

现象与判断对照

现象优先检查处理原则
值落到旧字段id 是否按数组下标生成按业务键稳定映射
候选框位置偏移rect 是否重新测量窗口变化后重算
两个字段同时高亮焦点是否分散更新出口统一归一化
偶现上一页节点旧测量回调是否迟到generation 拒绝旧结果

为什么选择这个实现

稳定 id 解决“这是谁”,唯一焦点解决“当前是谁”,generation 解决“属于哪次布局”。三个问题分别建模,比增加延时可靠。

可复用边界

可以把节点映射、焦点归一化和矩形校验封装成快照构建器,表单页面只提供字段键和测量结果。

验证记录

已验证同字段 id 稳定、不同字段 id 分离、双焦点归一为一个,以及旧 generation 提交被拒绝。

本文的策略代码已在宿主 JavaScript 环境执行断言,用来验证状态、排序、去重或边界计算。它不等同于 HarmonyOS 7 API 26 工程编译,也不等同于真机系统能力验证;涉及系统回调、设备能力、窗口形态或跨应用 IPC 的部分,仍应在对应 SDK 与设备上完成端到端验收。

上线前检查清单

  • 字段 id 不使用数组下标
  • 同批快照 id 唯一
  • 同批快照焦点唯一
  • rect 有面积且位于当前窗口
  • 窗口变化递增 generation
  • API 26 设备完成端到端自动填充验证

官方资料

自动填充目标错误通常不是单个字段错,而是整份快照不在同一时刻。用稳定身份、唯一焦点和代际号统一出口,问题会清楚很多。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐