讨论广场 问答详情
FormLink router事件跳转后,目标UIAbility接收到的params数据不完整或为空,怎么回事?
2401_88933542 2025-11-28 11:42:59
103 评论 分享
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参数有什么限制?

 

103 评论 分享
写回答
全部评论(1)

FormLink 的 params 参数不支持直接传递复杂对象,仅支持传递 JSON 可序列化的简单数据类型(字符串、数字、布尔值、简单对象 / 数组,且不能包含函数、日期对象、循环引用等)。你的代码中存在两个关键问题:

 

限制:只支持 string/number/boolean 等简单类型,复杂对象需手动序列化,总大小别超 100KB。

  1. 复杂对象序列化限制healthData 是自定义对象,虽然表面看是简单键值对,但 FormLink 在传递时会对参数进行 JSON 序列化,若对象中隐含不可序列化内容(如你的代码中虽没有,但默认序列化可能丢失部分属性),或系统对序列化的对象深度 / 属性数量有限制,会导致数据丢失。
  2. 日期对象问题new Date().getTime() 是数字类型(可序列化),但如果你的实际代码中曾包含 Date 实例(如 date: new Date()),会被序列化为 ISO 字符串 或 null,导致数据异常。
  3. 参数传递机制限制:FormLink 基于系统的跨 Ability 通信机制,params 的设计初衷是传递轻量、简单的参数,而非复杂对象,复杂对象可能因序列化 / 反序列化过程中的隐式转换导致属性丢失。

    你可以试试这么处理
    1、传参时把复杂对象转成 JSON 字符串:JSON.stringify(this.healthData) 2、接收时再转回来:JSON.parse(params.healthDataStr)
2025-11-28 14:43:59