当前位置: 首页 > news >正文

HarmonyOS应用开发实战:猫猫大作战-setInterception 的 willShow/willPop/didShow 三种拦截回调以及实际项目

前言

在一些业务场景中,页面跳转前需要执行校验逻辑——例如:用户未登录时跳转到登录页而不是目标页、权限不足时弹窗提示、需要统计跳转行为。HarmonyOS 的 Navigation 提供了setInterception路由拦截机制,可以在页面跳转的各个阶段注入自定义逻辑。

本文以「猫猫大作战」的登录拦截和游戏状态拦截为锚点,讲解 setInterception 的 willShow/willPop/didShow 三种拦截回调以及实际项目中的应用。

提示:本系列不讲 ArkTS 基础语法与环境搭建,假设你已跟完第 1–86 篇。本篇是阶段三第 87 篇。

一、setInterception 概述

1.1 接口定义

interface NavigationInterception { willShow?: (context: NavigationRouteContext) => void; // 页面显示前 willPop?: (context: NavigationRouteContext) => void; // 页面返回前 didShow?: (context: NavigationRouteContext) => void; // 页面显示后 } interface NavigationRouteContext { name: string; // 页面名称 param: Object; // 页面参数 popParam?: Object; // 返回参数 }

1.2 注册拦截

this.navStack.setInterception({ willShow: (context) => { console.info(`即将显示: ${context.name}`); }, willPop: (context) => { console.info(`即将返回: ${context.name}`); }, didShow: (context) => { console.info(`已显示: ${context.name}`); } });

二、willShow 拦截 — 页面显示前

2.1 登录拦截

this.navStack.setInterception({ willShow: (context) => { const isLoggedIn = AppStorage.get<boolean>('isLoggedIn') ?? false; // 未登录时跳转到登录页 if (!isLoggedIn && context.name !== 'pages/Login') { context.param.redirectAfterLogin = context.name; // 修改跳转目标为登录页 // 注意:setInterception 中不支持修改 name,需在业务层处理 } } });

2.2 游戏状态拦截

this.navStack.setInterception({ willShow: (context) => { if (context.name === 'pages/Leaderboard') { // 记录跳转来源 Analytics.report('page_view', { page: 'Leaderboard' }); } } });

三、willPop 拦截 — 页面返回前

this.navStack.setInterception({ willPop: (context) => { // 返回时保存页面状态 if (context.name === 'pages/GameBoard') { AppStorage.setOrCreate('lastGameState', 'paused'); } } });

四、didShow 拦截 — 页面显示后

this.navStack.setInterception({ didShow: (context) => { // 页面渲染完成后的回调 console.info(`页面 ${context.name} 已完全显示`); } });

五、常见踩坑

5.1 坑一:setInterception 中修改 name

setInterception 的context.name是只读的,不能修改。如果需要重定向,在willShow中调用replacePath

// 在 pushPath 的调用方处理,而非 interception 中

5.2 坑二:多个 stackedNavigation 共享

每个 NavPathStack 实例有自己独立的拦截器,如果多个 Navigation 共享同一 stack,拦截器会被覆盖。

六、总结

setInterception 是 Navigation 提供的路由拦截机制,支持 willShow/willPop/didShow 三种粒度的拦截回调。

核心要点

  • willShow:页面显示前拦截(适合登录校验、埋点)
  • willPop:页面返回前拦截(适合保存状态)
  • didShow:页面显示后回调(适合统计)
  • context.name 只读,不支持重定向

下一篇预告:第 88 篇将深入 Split 分栏模式——大屏设备上的双栏布局。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

  • Navigation 跳转文档
  • Navigation 组件参考
  • 开源鸿蒙跨平台社区
  • 第 86 篇:NavPathStack 查询
  • 第 88 篇:Split 分栏模式
http://www.jsqmd.com/news/1277636/

相关文章:

  • FAT32文件系统下MP3播放器歌曲顺序错乱的解决方案
  • PHP-FPM进程管理6S策略详解:从原理到调优实战
  • verilog HDLBits刷题[Finite State Machines]“Fsm3”---Simple FSM 3 (asynchronous reset)
  • 如何在5分钟内完成本地AI部署?LocalAI终极隐私保护方案详解
  • 粉笔直播课vsB站免费课突破瓶颈效率对比
  • 开源AI模型管理挑战:TextGen如何通过智能下载引擎重塑本地部署体验
  • C++/Qt + Mqtt协议 实现客户端订阅/发布功能
  • MLOps 数据漂移检测:模型性能退化的自动预警
  • 大数据平台弹性伸缩架构设计与实践指南
  • AI辅助编程实战:蒙特卡洛模拟构建NBA选秀预测模型
  • 洛雪音乐音源实践手册:三步解锁全网无损音乐的完整方案
  • ICHSSR 2026:跨学科人文社科研究的数字化转型
  • (2026最新)台州本地人必选的靠谱漏水检测维修推荐:正规防水补漏防水-卫生间/厨房/屋顶/阳台/外墙渗漏水精准测漏,本地人的信赖之选 - 安佳防水
  • 从文字识别到文档智能:2026年主流OCR工具对比与技术选型全景指南
  • 【企业通信】基于ipad协议全类型消息发送接口设计:支持文本、多媒体、群聊及大文件传输的API
  • 3大革新突破:Chili3D如何让专业CAD设计在浏览器中触手可及
  • LocalAI深度解析:如何用开源引擎在普通硬件上运行各类AI模型的完整指南
  • 【CarbonData】什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用?
  • 19.1 Cloudflare Pages点击 「Drag and drop your files」 右侧的蓝色 「Get started」发生报错,不支持多文件
  • TPS92520-Q1同步降压LED驱动器评估:GUI操作与高级功能实战
  • 什么是原生IP?原生IP与住宅IP有何区别?
  • 基于YOLO与SpringBoot+Vue的道路缺陷智能检测系统实践
  • 暗黑破坏神2网页存档编辑器:零安装修改游戏存档的终极指南
  • Windows集成笔设备
  • 通义万相提示词工程实战:5类高转化率提示模板,90%用户不知道的隐藏参数调优法
  • Cursor+Firecrawl / Playwright MCP 实战:PGV 三循环法实现网站高效复刻,前端开发效率提升 75%
  • Java线程超时不抛异常?这招让代码2滚蛋继续干
  • DataHub数据质量监控:从静态规则到智能异常检测的演进之路
  • 2026年威海老旧小区加装电梯服务商选择全攻略 - 装修教育财税推荐2026
  • 利用 Taotoken 多模型能力为智能客服场景选择最佳模型