一、核心机制与流程
1. 事件触发与交互流程
- 卡片端触发机制
在ArkTS卡片中,通过postCardAction接口触发message事件,拉起FormExtensionAbility,并通过onFormEvent回调通知应用。
// 卡片页面中触发message事件示例
Button() {
Text('刷新')
}
.onClick(() => {
postCardAction(this, {
action: 'message',
abilityName: 'EntryAbility',
params: { msgTest: 'messageEvent' } // 自定义参数
});
})
应用端响应流程
FormExtensionAbility 在 onFormEvent 生命周期中接收事件消息并处理:
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' }); // 抛出类型错误
数据类型限制
支持 Object 或 JSON字符串,复杂类型需手动序列化:
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,其他仍在测试,后期会逐渐更新。若有错误,欢迎指正。