最新版鸿蒙卡片开发第一弹:Message事件

29 阅读2分钟

一、核心机制与流程

1. 事件触发与交互流程

  • 卡片端触发机制
    在ArkTS卡片中,通过 postCardAction 接口触发 message 事件,拉起 FormExtensionAbility,并通过 onFormEvent 回调通知应用。
 // 卡片页面中触发message事件示例  
Button() {  
  Text('刷新')  
}  
.onClick(() => {  
  postCardAction(this, {  
    action: 'message',  
    abilityName: 'EntryAbility',  
    params: { msgTest: 'messageEvent' }  // 自定义参数  
  });  
})  

应用端响应流程
FormExtensionAbilityonFormEvent 生命周期中接收事件消息并处理:

onFormEvent(formId: string, message: string): void {  
  hilog.info(0xFF00, 'TAG', `收到事件消息: ${message}`);  
  // 根据参数执行数据更新逻辑  
  let newData = { title: '新标题', detail: '新内容' };  
  let formData = formBindingData.createFormBindingData(newData);  
  formProvider.updateForm(formId, formData);  
}  

二、数据更新逻辑

数据封装与传输
必须使用 FormBindingData
所有卡片数据必须通过 formBindingData.createFormBindingData() 封装为专用数据对象,否则系统无法解析。

// 正确方式  
let data = { key: 'value' };  
let formData = formBindingData.createFormBindingData(data);  
formProvider.updateForm(formId, formData);  

// 错误方式(直接传递普通对象)  
formProvider.updateForm(formId, { key: 'value' }); // 抛出类型错误  

数据类型限制
支持 ObjectJSON字符串,复杂类型需手动序列化:

let timestamp = new Date().toISOString();  
let formData = formBindingData.createFormBindingData({ time: timestamp });  

三、底层机制解析

  • 数据序列化
    FormBindingData 内部通过序列化实现数据跨进程传输(卡片进程 ↔ 应用进程),确保数据格式一致性。

  • 生命周期管理
    FormExtensionAbility 作为独立扩展模块,负责处理卡片事件和数据更新,与主应用进程解耦,提升稳定性。

2. 更新流程对比

直接更新规范更新
普通对象直接传递通过 FormBindingData 封装
报错:Error: Incorrect data type触发UI刷新

四、数据驱动更新策略

  • LocalStorage共享
    使用 LocalStorageProp 装饰器实现卡片与 FormExtensionAbility 动态数据绑定:

    @Entry 
    @Component  
    struct DynamicCard {  
      @LocalStorageProp('updateFlag') flag: boolean = false;  
      // 根据flag动态更新UI  
    }  
    
  • 多实例管理
    当存在多个卡片实例时,通过 formId 区分数据源:

    onAddForm(want: Want) {  
      const instanceKey = want.parameters['identityKey'];  
      let data = loadDataForInstance(instanceKey); // 加载对应实例数据  
      return formBindingData.createFormBindingData(data);  
    }  
    

    仅仅先分享最新版的第一个事件类型,因为其亲测有效,其他事件类型由于是最新版本API,其他仍在测试,后期会逐渐更新。若有错误,欢迎指正。