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

先确认 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 设备完成端到端自动填充验证
官方资料
自动填充目标错误通常不是单个字段错,而是整份快照不在同一时刻。用稳定身份、唯一焦点和代际号统一出口,问题会清楚很多。
更多推荐



所有评论(0)