FormLink router事件跳转后,目标UIAbility接收到的params数据不完整或为空,怎么回事?
harmonyos
我在开发一个健康管理应用的卡片,需要使用FormLink的router事件跳转到主应用并传递一些健康数据。但在目标UIAbility中接收到的数据总是有问题。
@Entry
@Component
struct HealthCard {
@LocalStorageLink('healthData') healthData: object = {
steps: 8500,
heartRate: 72,
sleepHours: 7.5,
date: '2024-01-15'
}
build() {
Column() {
Text("今日步数: " + this.healthData.steps)
.fontSize(16)
.margin(10)
FormLink({
action: "router",
abilityName: "HealthDetailAbility",
bundleName: "com.example.health",
params: {
'healthData': this.healthData, // 传递复杂对象
'timestamp': new Date().getTime(),
'source': 'card'
}
}) {
Button("查看详情")
.width(120)
.height(36)
}
}
}
}
目标UIAbility中接收数据:
export default class HealthDetailAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
// 从startParameter获取参数
const params = windowStage.mainWindow?.getUIContext()?.getStartParameter()
console.info("接收到的参数:", JSON.stringify(params))
// 输出结果中healthData对象不完整,只有部分属性
}
}
为什么传递的复杂对象在目标UIAbility中接收不完整?FormLink的params参数有什么限制?
您需要先 登录 才能评论/回答
全部评论(1)
FormLink 的 params 参数不支持直接传递复杂对象,仅支持传递 JSON 可序列化的简单数据类型(字符串、数字、布尔值、简单对象 / 数组,且不能包含函数、日期对象、循环引用等)。你的代码中存在两个关键问题:
限制:只支持 string/number/boolean 等简单类型,复杂对象需手动序列化,总大小别超 100KB。
- 复杂对象序列化限制:
healthData是自定义对象,虽然表面看是简单键值对,但 FormLink 在传递时会对参数进行 JSON 序列化,若对象中隐含不可序列化内容(如你的代码中虽没有,但默认序列化可能丢失部分属性),或系统对序列化的对象深度 / 属性数量有限制,会导致数据丢失。 - 日期对象问题:
new Date().getTime()是数字类型(可序列化),但如果你的实际代码中曾包含Date实例(如date: new Date()),会被序列化为ISO 字符串或null,导致数据异常。 - 参数传递机制限制:FormLink 基于系统的跨 Ability 通信机制,
params的设计初衷是传递轻量、简单的参数,而非复杂对象,复杂对象可能因序列化 / 反序列化过程中的隐式转换导致属性丢失。
你可以试试这么处理
1、传参时把复杂对象转成 JSON 字符串:JSON.stringify(this.healthData)2、接收时再转回来:JSON.parse(params.healthDataStr)
2025-11-28 14:43:59