当前位置: 首页 > news >正文

【共创季稿事节】HarmonyOS7 互动卡片开发实践:EntryFormAbility 如何保存和管理卡片实例


文章目录

      • 效果图
      • 这篇主要看哪个文件
      • onAddForm 做了什么
      • 第一步:从 want 里拿系统参数
      • 第二步:保存 FormInfo
      • 第三步:音乐卡片特殊处理
      • 返回初始化数据
      • onRemoveForm 也别忘了
      • 小白可以自己写一个最小版
      • 排查清单
      • 写在最后

EntryFormAbility是普通卡片的管家。小白刚接触互动卡片时,最容易忽略它,以为卡片页面写好了就行。

其实不行。桌面上可能同时放了多张音乐卡片、运动卡片、快递卡片。你后面要刷新哪一张?要删除哪一张?要批量更新哪些卡片?这些都要靠EntryFormAbility保存下来的formId

效果图

这一篇不直接讲动画,而是讲这些效果背后的“实例管理”。只有EntryFormAbility记住每一张桌面卡片,后面点击播放、运动、快递、睡眠状态时,才知道该刷新谁。

先把实例保存清楚,漂亮的互动效果才不会更新错卡片。

这篇主要看哪个文件

打开:

entry/src/main/ets/entryformability/EntryFormAbility.ets

它里面有几个核心生命周期:

  • onAddForm():添加卡片时调用。
  • onUpdateForm():系统请求刷新时调用。
  • onFormEvent():普通卡片发消息时调用。
  • onRemoveForm():移除卡片时调用。
  • onAcquireFormState():返回卡片状态。

这一篇重点看onAddForm()onRemoveForm()

onAddForm 做了什么

项目里的代码核心是:

onAddForm(want:Want):formBindingData.FormBindingData{letformId:string='';letformWidth:number=-1;letformHeight:number=-1;if(want.parameters){formId=want.parameters['ohos.extra.param.key.form_identity']asstring;letformName=want.parameters['ohos.extra.param.key.form_name']asstring;letformDimension=want.parameters['ohos.extra.param.key.form_dimension']asstring;formWidth=want.parameters['ohos.extra.param.key.form_width']asnumber;formHeight=want.parameters['ohos.extra.param.key.form_height']asnumber;letformInfo=newFormInfo();formInfo.formId=formId;formInfo.formDimension=formDimension;formInfo.formName=formName;FormUtils.insertFormData(this.context,formInfo);if(formName.includes('Music')){FormUtils.updateMusicControlCard(formId,true);}}returnformBindingData.createFormBindingData({formId:formId,formWidth:formWidth,formHeight:formHeight});}

小白先别慌,拆开看。

第一步:从 want 里拿系统参数

添加卡片时,系统会把参数放进want.parameters。项目取了这些字段:

formId=want.parameters['ohos.extra.param.key.form_identity']asstring;letformName=want.parameters['ohos.extra.param.key.form_name']asstring;letformDimension=want.parameters['ohos.extra.param.key.form_dimension']asstring;

这三个最重要。

  • formId:系统给这张卡片分配的唯一 ID。
  • formName:卡片名称,比如MusicCard
  • formDimension:卡片尺寸,比如2*4

formId是后续更新卡片的钥匙。没有它,formProvider.updateForm()就不知道更新谁。

第二步:保存 FormInfo

项目创建了一个FormInfo

letformInfo=newFormInfo();formInfo.formId=formId;formInfo.formDimension=formDimension;formInfo.formName=formName;

然后交给FormUtils

FormUtils.insertFormData(this.context,formInfo);

FormUtils内部会调用FormRdbHelper,把这条卡片实例保存到 RDB。

为什么不用数组保存?

因为 Ability 生命周期可能被系统回收。内存数组没了,桌面卡片还在。RDB 更靠谱。

第三步:音乐卡片特殊处理

项目里有一段:

if(formName.includes('Music')){FormUtils.updateMusicControlCard(formId,true);}

这段是为了解决一个实际问题:新添加的音乐卡片不知道当前播放状态。

所以添加音乐卡片后,先给这张卡片下发:

isNeedRequestUpdate:true

音乐卡片页面里监听到这个字段变化后,会主动向应用请求当前播放数据。

这就是一个很实用的设计:新增卡片不直接猜状态,而是主动请求同步。

返回初始化数据

onAddForm()最后返回:

returnformBindingData.createFormBindingData({formId:formId,formWidth:formWidth,formHeight:formHeight});

这些数据会被普通卡片页面通过@LocalStorageProp接收。

比如你可以在卡片里写:

@LocalStorageProp('formId')formId:string='';@LocalStorageProp('formWidth')formWidth:number=0;@LocalStorageProp('formHeight')formHeight:number=0;

字段名必须一致。返回里叫formId,卡片里也要叫formId

onRemoveForm 也别忘了

添加时保存,删除时就要清理:

onRemoveForm(formId:string):void{FormUtils.deleteFormInfo(this.context,formId);}

这段很短,但很重要。

如果不删除,数据库里会残留已经不存在的卡片。后面批量更新时,可能会尝试更新一个已经被移除的formId,日志里就会出现各种失败。

小白可以自己写一个最小版

如果你想练习,可以先写一个简化版:

import{formBindingData,FormExtensionAbility}from'@kit.FormKit';importWantfrom'@ohos.app.ability.Want';exportdefaultclassEntryFormAbilityextendsFormExtensionAbility{onAddForm(want:Want):formBindingData.FormBindingData{constparams=want.parameters??{};constformId=params['ohos.extra.param.key.form_identity']asstring;constformName=params['ohos.extra.param.key.form_name']asstring;constformDimension=params['ohos.extra.param.key.form_dimension']asstring;console.info(`add form:${formId},${formName},${formDimension}`);returnformBindingData.createFormBindingData({formId,formName,formDimension});}onRemoveForm(formId:string):void{console.info(`remove form:${formId}`);}}

先用这个确认生命周期能跑,再接入项目里的FormUtilsFormRdbHelper

排查清单

如果onAddForm()没按预期执行,按这个顺序查:

  1. module.json5是否注册了EntryFormAbility,类型是不是form
  2. form_config.json的普通卡片是否配置正确。
  3. Index.ets添加卡片时abilityName是否写EntryFormAbility
  4. want.parameters里有没有form_identityform_nameform_dimension
  5. FormUtils.insertFormData()是否执行成功。

写在最后

EntryFormAbility不写复杂 UI,但它非常关键。它负责把“桌面上的卡片实例”变成项目里可查询、可更新、可删除的数据。

记住一句话:想让卡片后续能刷新,先把formId保存好。

http://www.jsqmd.com/news/1038502/

相关文章:

  • UI-TARS Desktop:3步让AI助手帮你完成电脑操作的完整指南
  • 外企高管读EMBA有必要吗?客观选型测评指南 - 品牌2026推荐
  • HC12汇编编程:从MCUez错误代码到高效嵌入式开发实践
  • 【小白也能轻松用】AI智能体快速搭建,OpenClaw v2.7.9零基础一键部署方案(含最新安装包)
  • 2026扬州市APP开发公司综合排名:企业数字化选型指南 - IT老炮老刘
  • 如何快速掌握高效日志分析:Windows平台的终极解决方案LogExpert
  • M2.7动态计算图与自我进化机制深度解析
  • 2026徐州市APP开发服务商推荐:综合评分榜 - IT老炮老刘
  • 2026常州市APP开发公司TOP10:高端且有性价比的服务商 - IT老炮老刘
  • pdf转excel保持表格格式的工具推荐?2026免费888PDF转换器表格完美还原实测 - 工具测试专家
  • PowerToys中文版:免费提升Windows效率的终极工具集
  • 大模型缝合技术:KV缓存共享实现推理能力叠加
  • 2026宁波市APP开发服务商排名:高端定制公司推荐 - IT老炮老刘
  • Windows上的APK安装神器:告别复杂命令,3步轻松安装安卓应用
  • UI-TARS Desktop:从代码奴隶到数字管家的AI革命
  • 2026年璧山区口碑好的牙齿矫正品牌:选择攻略与推荐分析
  • 终极指南:如何用BiliTools免费下载B站视频和番剧
  • 微信机器人防封终极指南:基于WeChaty的多模型AI智能助手实战部署
  • 【2026年6月】精编土工格栅与土工材料厂家推荐指南 - 多才菠萝
  • ansible急速入门实战篇
  • 2026苏州市APP开发公司排名:十大定制开发服务商推荐 - IT老炮老刘
  • 项目管理:从需求蔓延到交付可控的工程化管控框架
  • DeepSeek R1不是GPT蒸馏产物:从软标签缺失到VCOT架构的真相
  • 2026年6月市政水务在线余氯监测仪知名品牌排行榜:技术迭代、国产替代与全场景选型深度分析 - 液体流量液位品牌推荐
  • 2026南京市APP定制开发公司排名:哪家更适合企业长期合作 - IT老炮老刘
  • MSC8102分组电话农场卡硬件设计深度解析:从多处理器架构到电信级板卡实战
  • 2026世界杯竞猜福利!免费赢AI尚运动相机+五折购机券
  • MAX795TESA+T是一款8 脚工业级监控芯片 + 3.3V 系统 RAM 断电存储方案
  • 2026无锡市APP软件开发公司排名:企业选型参考 - IT老炮老刘
  • 跨端体验一致性:CodePlus前端的响应式设计与无障碍访问探索