HarmonyOS 6.0 页面间数据传递与参数序列化
页面跳转带数据这谁不会pushPath的时候把参数传过去就完了。但现实远没这么简单——传个字符串没问题传个对象呢传个Date呢传个100KB的JSON呢跨Ability跳转呢返回时怎么带数据回来每个问题踩一遍你就知道传参这两个字背后有多少坑。Navigation参数传递NavPathStack的pushPath支持param参数this.navPathStack.pushPath({name:DetailPage,param:{id:42,title:测试文章}});目标页面通过onGetParam回调接收BuilderDetailPage(){NavDestination(){DetailContent()}.onGetParam((param:Object){letpparamasRecordstring,Object;this.itemIdp[id]asnumber;this.itemTitlep[title]asstring;})}关键param的类型是Object需要手动转换。ArkTS不支持泛型参数所以pushPath时传入的param在接收端是Object类型必须用as转换或逐字段取值。参数类型限制Navigation的param参数只支持可序列化类型。这意味着类型能传吗说明number/string/boolean能基本类型没问题普通对象(Record)能字段都是基本类型数组能元素是基本类型Date不能反序列化后变成stringMap/Set不能序列化后丢失类型函数/回调不能不可序列化class实例看情况只有序列化友好的字段能保留Date是高频踩坑点。你以为传了个Date对象过去收到一打开发现是个ISO字符串。解决方式是传时间戳// 发送端this.navPathStack.pushPath({name:SchedulePage,param:{timestamp:Date.now()}});// 接收端lettimestampp[timestamp]asnumber;letdatenewDate(timestamp);复杂对象传递对象嵌套对象时序列化会展平类型信息interfaceAddress{city:string;street:string;}interfaceUser{name:string;age:number;address:Address;}// 传参letuser:User{name:张三,age:25,address:{city:北京,street:中关村}};this.navPathStack.pushPath({name:UserDetail,param:user});// 接收端——address的类型信息丢失了.onGetParam((param:Object){letpparamasRecordstring,Object;letnamep[name]asstring;letaddressObjp[address]asRecordstring,Object;letcityaddressObj[city]asstring;})嵌套层级越深类型转换越痛苦。实际项目中建议只传ID到目标页面再查数据// 只传IDthis.navPathStack.pushPath({name:UserDetail,param:{userId:user.id}});// 目标页面用ID查完整数据.onGetParam(async(param:Object){letpparamasRecordstring,Object;letuserIdp[userId]asnumber;this.userawaitthis.userService.getById(userId);})只传ID的好处数据永远是新鲜的不会因为传了旧数据而显示过期内容参数体积小不需要序列化复杂对象。返回值传递NavPathStack支持pop带返回值// 详情页返回时带数据this.navPathStack.pop({updated:true,itemId:42});// 上一个页面接收this.navPathStack.pushPath({name:DetailPage,param:{id:42}}).then((result:Object){letrresultasRecordstring,Object;letupdatedr[updated]asboolean;if(updated){this.refreshList();}});注意不是所有pushPath都支持then接收返回值。只有当目标页面用pop(Object)返回时then才会触发。如果用户点系统返回键或者手势返回pop没带参数then就不会触发。更可靠的方式是监听navPathStack的变化aboutToAppear():void{this.navPathStack.on(pop,(info:PopInfo){if(info.param!undefined){letresultinfo.paramasRecordstring,Object;letupdatedresult[updated]asboolean;if(updated){this.refreshList();}}});}on(‘pop’)在每次栈弹出时都会触发不管是代码pop还是手势返回。比then更可靠。大数据传递参数体积过大超过100KB时Navigation的序列化会有性能问题。几个解决方案全局状态把数据放到AppStorage或PersistentStorage只传key// 写入全局状态AppStorage.setOrCreate(draftArticle,article);// 只传标记this.navPathStack.pushPath({name:Preview,param:{from:draft}});// 目标页读取letarticleAppStorage.getArticle(draftArticle);文件中转数据写临时文件传文件路径import{fileIo}fromkit.CoreFileKit;// 写入临时文件lettempPaththis.context.tempDir/transfer_data.json;fileIo.writeTextSync(tempPath,JSON.stringify(largeData));this.navPathStack.pushPath({name:Target,param:{filePath:tempPath}});// 目标页读取letcontentfileIo.readTextSync(filePath);单例管理器用内存中的单例持有数据classDataTransferManager{privatestaticinstance:DataTransferManager;privatecache:Mapstring,ObjectnewMap();staticgetInstance():DataTransferManager{if(!DataTransferManager.instance){DataTransferManager.instancenewDataTransferManager();}returnDataTransferManager.instance;}put(key:string,data:Object):void{this.cache.set(key,data);}get(key:string):Object|undefined{returnthis.cache.get(key);}remove(key:string):void{this.cache.delete(key);}}// 使用lettransferKeydata_Date.now().toString();DataTransferManager.getInstance().put(transferKey,largeData);this.navPathStack.pushPath({name:Target,param:{transferKey:transferKey}});// 目标页letdataDataTransferManager.getInstance().get(transferKey);DataTransferManager.getInstance().remove(transferKey);单例方式最简单但要记得用完删除否则内存泄漏。跨Ability传递跨Ability跳转用want传参import{common,Want}fromkit.AbilityKit;letwant:Want{bundleName:com.example.app,abilityName:SecondAbility,parameters:{userId:42,userName:张三}};this.context.startAbility(want);目标Ability在onCreate/onWindowStageCreate中获取参数onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{letparamswant.parameters;letuserIdparams[userId]asnumber;}跨Ability的parameters限制更严格——只支持基本类型和简单对象不支持函数、class实例、循环引用对象。这跟Navigation的param限制一样但跨Ability序列化是系统级操作成本更高。参数校验永远不要假设参数一定存在.onGetParam((param:Object){if(paramnull||paramundefined){// 无参数进入显示默认内容this.itemId-1;return;}letpparamasRecordstring,Object;if(p[id]!undefined){this.itemIdp[id]asnumber;}else{this.itemId-1;}})用户可能从深链接、通知、桌面快捷方式进入这些场景可能没有参数。不校验就crash。参数与深链接deepLink进入时参数通过want传递格式是URI// scheme://host/path?keyvalueletwant:Want{uri:myapp://detail?id42fromnotification};// 在Ability中解析leturiwant.uriasstring;leturlnewURL(uri);letidurl.searchParams.get(id);URL解析支持查询参数。但注意URI里的参数都是字符串类型42需要手动parseInt转数字。踩坑清单问题原因解决传Date收到字符串Date被序列化为ISO字符串传时间戳number传class实例丢失方法序列化只保留数据字段只传数据方法在目标页重建返回值then不触发用户手势返回没带参数用on(‘pop’)监听大对象传递卡顿Navigation序列化开销用AppStorage或单例中转跨Ability参数丢失parameters不支持复杂类型只传基本类型或JSON字符串参数undefined导致crash没做空值校验每个字段都判空深链接参数是字符串URI查询参数无类型手动parseInt/parseFloatMap/Set传过去变空不可序列化转成数组再传嵌套对象类型丢失反序列化返回Record只传ID或逐层as转换临时文件没清理tempDir写入后忘记删aboutToDisappear中清理传参的核心原则简单数据用Navigation param复杂数据用全局状态或单例中转跨Ability用want parameters永远只传最小必要信息。传ID不传对象传时间戳不传Date传key不传数据。这不是偷懒是工程素养。

相关新闻

锐龙AI嵌入式X100与Kria AI齐发,AMD打通物理AI“任督二脉”

锐龙AI嵌入式X100与Kria AI齐发,AMD打通物理AI“任督二脉”

作者:毛烁 “物理 AI(Physical AI)是科技领域最艰巨的挑战之一。而实现这一级别的智能,需要一套全栈式解决方案。”在今年的CES大会上,AMD 董事长兼CEO 苏姿丰(Lisa Su)博士的这番判断&#xff…

2026/10/6 4:57:38 阅读更多 →
深入解析OpenClaw与Hermes:大模型系统对比与收藏指南

深入解析OpenClaw与Hermes:大模型系统对比与收藏指南

OpenClaw和Hermes作为通用Agent系统,虽同属大类,但在工程重心上存在差异。OpenClaw侧重于本地优先的Agent Gateway,致力于连接真实世界的入口、会话、设备和权限;而Hermes则更像一个学习型Agent Runtime,专注于让Agent…

2026/10/6 19:19:28 阅读更多 →
Claude 3 Opus刷新ARC-AGI基准测试纪录:从记忆到推理的AI进化

Claude 3 Opus刷新ARC-AGI基准测试纪录:从记忆到推理的AI进化

最近在 AI 圈子里,一个消息引起了不小的震动:Claude 3 Opus 在 ARC-AGI 基准测试中刷新了纪录,达到了新的 SOTA(State-of-the-Art)水平。这不仅仅是又一个模型在某个榜单上超越了前作那么简单——它触及了一个更深层的…

2026/10/12 23:20:03 阅读更多 →

最新新闻

大模型落地关键:上下文工程实战与踩坑指南

大模型落地关键:上下文工程实战与踩坑指南

我最早意识到“上下文”是个工程问题,是在一个跨语言文档问答项目里。同一个模型,同一个接口,系统提示词也一模一样,可用户问“上个月报表里的异常波动是什么原因”,它答得头头是道;用户换个说法问同一个问…

2026/10/13 20:36:46 阅读更多 →
VOC转COCO格式转换实战:语义对齐、ID校验与工业级鲁棒实现

VOC转COCO格式转换实战:语义对齐、ID校验与工业级鲁棒实现

1. 项目概述&#xff1a;为什么VOC转COCO不是“格式换壳”&#xff0c;而是模型训练的底层适配你手头有一批用Pascal VOC标准标注的图像数据集——每张图对应一个XML文件&#xff0c;里面用<object>标签框出目标位置&#xff0c;用<name>写类别名&#xff0c;用<…

2026/10/13 20:36:46 阅读更多 →
把决策权从LLM手里拿回来:Agent可控性改造实践

把决策权从LLM手里拿回来:Agent可控性改造实践

1. 为什么我想把决策权从LLM手里拿回来最近半年我一直在折腾 Agent 编排&#xff0c;陆续用主流大模型 API 搭过客服工单处理、数据分析助手、内容自动回复这类内部工具。项目越做越多&#xff0c;一个感觉越来越强烈&#xff1a;让 LLM 直接做决策&#xff0c;短期看很惊艳&am…

2026/10/13 20:36:46 阅读更多 →
PySpark中DataFrame与RDD的核心差异与协同使用指南

PySpark中DataFrame与RDD的核心差异与协同使用指南

1. 项目概述&#xff1a;为什么PySpark里总在纠结DataFrame和RDD&#xff1f;“pyspark&#xff1a;dataframe与rdd的一点小事”——这标题看着轻描淡写&#xff0c;像茶余饭后随口一提的闲话&#xff0c;但凡真在生产环境跑过Spark任务的人&#xff0c;看到这句都会下意识停顿…

2026/10/13 20:36:46 阅读更多 →
GUI智能体如何自我进化?证据驱动框架演化实战

GUI智能体如何自我进化?证据驱动框架演化实战

1. 项目缘起与核心问题拆解GUI 智能体这两年是个热得发烫的方向。简单说&#xff0c;就是让一个 AI 去操作图形界面——点按钮、填表单、拖滚动条、读弹窗&#xff0c;像人一样把软件用起来。但真正上手做过的人都知道&#xff0c;这东西的难点从来不在“能不能点”&#xff0c…

2026/10/13 20:36:46 阅读更多 →
前端链接测试从入门到落地:href 检测方案与实战经验

前端链接测试从入门到落地:href 检测方案与实战经验

做前端开发这些年&#xff0c;我越来越确定一件事&#xff1a;链接测试是所有页面检查里最容易被忽略、但一旦翻车影响面又最大的环节。“test href”这个短语初看像占位符&#xff0c;实际上它点破了一个很实在的动作——把页面里每一个 a 标签的 href 都当成潜在事故点&#…

2026/10/13 20:35:41 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →