PageB 返回 PageA,主页 onResult 为什么不再响:HarmonyOS 7 修正了结果归属
·
PageB 返回 PageA,主页 onResult 为什么不再响:HarmonyOS 7 修正了结果归属
一个多级编辑流程把主页 NavDestination 的 onResult 当成全局兜底:PageB 返回 PageA 时,PageA 没设置回调,旧版本会意外触发主页回调,于是业务“看起来能保存”。升级后主页不再收到结果,保存逻辑暴露为空。平台修复的不是回调能力,而是结果归属。
API 26 同时修正两处行为:queryNavDestinationInfo 可以取得主页 NavDestination 信息;非主页目标没有设置 onResult 时,返回它不再误触发主页 onResult。
验证边界:本文依据华为 2026-08-19 更新的 HarmonyOS 7(API 26)Beta1 行为变更说明。示例中的判定与状态模型已在宿主 Node.js 环境跑过断言;平台组件接入片段未在 API 26 SDK 或真机编译运行,不能替代目标设备验收。

把返回结果理解成有明确收件人的消息
| 返回路径 | 正确接收者 | 不应承担的人 |
| PageB → PageA | PageA 自己的结果处理 | Home 兜底 |
| PageA → Home | Home(业务需要时) | 任意仍在栈中的页面 |
| 查询主页信息 | queryNavDestinationInfo 结果 | 手写固定主页名 |
案例一:编辑页返回列表页
给每次打开页面分配请求标识,并让发起页拥有回调。不要依赖“没人接就落到主页”。
type NavRequest = { requestId: string; from: string; to: string };
type NavResult = { requestId: string; payload: unknown };
function acceptResult(request: NavRequest, result: NavResult): boolean {
return request.requestId === result.requestId && request.to !== request.from;
}
const req = {requestId:'edit-42',from:'PageA',to:'PageB'};
if (!acceptResult(req,{requestId:'edit-42',payload:{saved:true}})) throw new Error('owner');
if (acceptResult(req,{requestId:'other',payload:{saved:true}})) throw new Error('cross delivery');
案例二:埋点通过主页 onResult 统计所有返回
这种做法本身就把路由回调和全局观测混在一起。全局埋点应监听路由栈变化或封装导航命令,不应依赖错误传播。
type Transition = { before: string[]; after: string[] };
function poppedPages(t: Transition): string[] {
const keep = t.after.length;
return t.before.slice(keep);
}
const popped = poppedPages({before:['Home','PageA','PageB'],after:['Home','PageA']});
if (popped.join(',') !== 'PageB') throw new Error('transition');
该模型只用于说明观测思路。真实路由栈可能包含替换、单例和恢复场景,需要使用项目的导航封装记录命令与结果。
queryNavDestinationInfo 修复后要防什么
以前查询主页得到空值的代码,可能自动回退到固定名称;升级后查询成功,两个分支可能产生不同埋点或样式。删除回退前先比对主页名称、层级和 isInner 参数的语义,不能看到非空就认定是目标页面。
回归清单
- Home、PageA、PageB 各自拥有明确结果回调。
- 未注册回调时不会由主页偷偷接管。
- 连续返回、多次打开和页面恢复不会串 requestId。
- 查询主页信息的成功/失败分支都有日志。
- 迁移后保存、刷新和埋点分别验收。
官方依据
更多推荐

所有评论(0)