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

卡片刷新三板斧:定时、定点、主动请求——搞清楚才不会乱

文章目录

      • 先搞明白谁在控制刷新
      • 方式一:定时刷新(updateDuration)
      • 方式二:定点刷新(scheduledUpdateTime)
      • 方式三:主动请求刷新(formHost.requestForm)
      • 三种方式对比
      • 卡片 UI 接收数据
      • 整体数据流图
      • 常见问题
      • 写在最后

写卡片刷新功能踩了不少坑,最大的问题是:刷新方式有三种,文档描述很相似,一不小心配错了,卡片数据死活不更新,死活不知道原因。今天把这三种方式彻底讲清楚。

先搞明白谁在控制刷新

刷新卡片数据的流程是这样的:

  1. 触发刷新(可能是定时器、定点时间、宿主应用按钮)
  2. 系统回调FormExtensionAbility.onUpdateForm(formId)
  3. 你在里面构造新数据,调formProvider.updateForm(formId, newData)推送
  4. 卡片 UI 收到LocalStorage更新,自动重渲染

三种刷新方式的区别只在第 1 步——触发方式不同,后面都一样。

方式一:定时刷新(updateDuration)

最简单,设置一个刷新间隔,系统自动按时来敲门。

form_config.json里配置:

{"forms":[{"name":"widget","updateEnabled":true,// 必须是 true,否则全部刷新功能都不生效"updateDuration":1,// 单位:30分钟,填 1 = 每30分钟刷一次"scheduledUpdateTime":""// 定时刷新时此字段留空或不填}]}

注意updateDuration的单位比较坑,不是分钟,也不是秒,是"30分钟的倍数"

updateDuration 值实际刷新间隔
130 分钟
260 分钟(1小时)
4824 小时

系统最短刷新间隔是 30 分钟,不能更短了,这是平台限制。

FormAbility 里处理刷新:

// entry/src/main/ets/entryformability/EntryFormAbility.etsimport{formBindingData,FormExtensionAbility,formProvider}from'@kit.FormKit';import{Want}from'@kit.AbilityKit';import{BusinessError}from'@kit.BasicServicesKit';exportdefaultclassEntryFormAbilityextendsFormExtensionAbility{onAddForm(want:Want):formBindingData.FormBindingData{// 卡片创建时返回初始数据constformData:Record<string,string>={};returnformBindingData.createFormBindingData(formData);}onUpdateForm(formId:string):void{// 系统按照 updateDuration 的间隔自动调用这个方法// 在这里准备新数据,然后推送给卡片classFormDataClass{title:string='Title Update.';// 对应卡片 UI 里的 title 绑定detail:string='Description update success.';// 对应卡片 UI 里的 detail 绑定}constformData=newFormDataClass();constformInfo=formBindingData.createFormBindingData(formData);// 关键:用 formProvider.updateForm 推送数据formProvider.updateForm(formId,formInfo).then(()=>{console.info('定时刷新成功');}).catch((error:BusinessError)=>{console.error(`定时刷新失败:${JSON.stringify(error)}`);});}}

方式二:定点刷新(scheduledUpdateTime)

在每天固定的时间点刷一次,比如每天上午 10:30 更新。

修改form_config.json

{"forms":[{"name":"widget","updateEnabled":true,"updateDuration":0,// 定点刷新时,updateDuration 要设为 0"scheduledUpdateTime":"10:30"// 每天 10:30 刷新,24小时制}]}

注意:updateDurationscheduledUpdateTime是互斥的。想用定点刷新,updateDuration必须设为0

onUpdateForm的代码和定时刷新完全一样,只是触发的时间点不同。

方式三:主动请求刷新(formHost.requestForm)

前两种是系统主动来找你,这种是宿主应用(卡片使用方)主动要求刷新。

典型场景:用户在应用里点了"刷新"按钮,你希望卡片立马更新数据。

宿主应用(FormUpdateDemo)的 Index 页面:

// entry/src/main/ets/pages/Index.etsimport{formHost}from'@kit.FormKit';import{BusinessError}from'@kit.BasicServicesKit';import{hilog}from'@kit.PerformanceAnalysisKit';constDOMAIN_NUMBER:number=0xFF00;letstorage=newLocalStorage();@Entry(storage)@Componentstruct Index{@StateformId:string='0';// 这个 ID 要从 FormComponent 的 onAcquired 回调里取build(){Column(){// FormComponent 展示卡片,同时获取 formIdFormComponent({id:0,name:'widget',bundle:'com.samples.formupdatedemo',ability:'EntryFormAbility',module:'entry',dimension:2,temporary:false,}).size({width:200,height:200}).borderColor(Color.Black).borderRadius(10).borderWidth(1)// 卡片成功加载后,拿到 formId.onAcquired((form:FormCallbackInfo)=>{hilog.info(DOMAIN_NUMBER,'testTag',`onAcquired:${JSON.stringify(form)}`);this.formId=form.id.toString();// 保存 formId,后续刷新用}).onRouter(()=>{hilog.info(DOMAIN_NUMBER,'testTag','onRouter');}).onError((error)=>{hilog.error(DOMAIN_NUMBER,'testTag',`onError:${JSON.stringify(error)}`);})Text(`当前 formId:${this.formId}`).fontSize(14).margin(10)// 点击按钮,主动请求刷新Button('刷新卡片').onClick(()=>{if(this.formId!=='0'){// formHost.requestForm 触发 onUpdateForm 回调formHost.requestForm(this.formId).then(()=>{hilog.info(DOMAIN_NUMBER,'testTag','主动请求刷新成功');}).catch((error:BusinessError)=>{hilog.error(DOMAIN_NUMBER,'testTag',`刷新失败:${error?.code}${error?.message}`);});}}).margin(5).width('50%')}.width('100%').height('100%')}}

流程重点:先从FormComponent.onAcquired拿到formId,再用formHost.requestForm(formId)触发刷新。如果没拿到formId就调用,直接报错。

三种方式对比

方式触发者配置位置最小间隔适用场景
定时刷新系统form_config.jsonupdateDuration30分钟定期更新天气、新闻等
定点刷新系统form_config.jsonscheduledUpdateTime每天一次每日早报、定时提醒
主动请求宿主应用代码调用无限制用户手动触发、实时数据

卡片 UI 接收数据

三种方式在FormAbility里最终都调用formProvider.updateForm,卡片 UI 通过@LocalStorageProp接收更新后的数据:

// entry/src/main/ets/widget/pages/WidgetCard.etsletstorage:LocalStorage=newLocalStorage();@Entry(storage)@Componentstruct WidgetCard{// 这两个字段名要和 FormAbility 里 FormDataClass 的字段名完全一致@LocalStorageProp('title')title:string='加载中...';@LocalStorageProp('detail')detail:string='';build(){Column(){Text(this.title).fontSize(16).fontColor('#FFFFFF').margin({top:'8%',left:'10%'})Text(this.detail).fontSize(12).fontColor('#FFFFFF').opacity(0.6).margin({top:'5%',left:'10%'})}.width('100%').height('100%')}}

整体数据流图

常见问题

Q:updateEnabled设成false了,但是requestForm还能用吗?

不能用。updateEnabled是总开关,关掉之后所有刷新方式(包括主动请求)都会被拦截,onUpdateForm不会被调用。

Q:定时刷新和定点刷新能同时配吗?

不能。两个配置互斥,同时填了系统只会用其中一种(通常是scheduledUpdateTime优先)。

Q:卡片在后台不可见时还会刷新吗?

不会,系统为了省电,不可见的卡片不会触发onUpdateForm。等卡片重新可见时,会触发一次刷新。

写在最后

这三种方式各有用途,别混用。想让卡片自动更新天气、股价用定时刷新;想让卡片每天固定时间更新日报用定点刷新;想让用户点按钮立刻刷新就用formHost.requestForm

选对了方式,卡片就省电又好用。

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

相关文章:

  • Arm DynamIQ DSU L3缓存电源管理技术解析
  • GTA5线上小助手:免费开源工具让你的游戏体验全面升级
  • 使用Taotoken聚合API后我们观测到的延迟稳定性与计费透明度
  • 别再替换同义词!2026实测论文降AIGC工具:一次降至10%以下的排版保护指南
  • 长期使用 Taotoken Token Plan 套餐对项目月度成本的实际影响观察
  • 辽宁本地草坪基地排行:5家靠谱实体品牌盘点 - 奔跑123
  • FMCW雷达设计避坑指南:带宽、采样率与探测距离,这些参数到底怎么权衡?
  • 终极解决方案:3分钟免费恢复微信网页版完整访问权限
  • 对比直接使用原厂API体验Taotoken在计费透明方面的优势
  • 微信好友检测终极指南:快速发现谁删除了你的免费解决方案
  • 碧蓝航线自动脚本Alas:解放双手的终极游戏助手完整指南
  • ViGEmBus:Windows游戏控制器模拟的终极解决方案深度解析
  • 辽宁草坪价格排行 高性价比基地实测对比 - 奔跑123
  • Windows终极优化神器:WinUtil - 一键解决系统安装、优化、修复的完整指南
  • 激光雷达选型与性能深潜:从视场角、点云密度到有效探测距离的实战解析
  • AI Agent接管你电脑前,必须关闭的6个系统安全开关,否则面临RCE风险(CVE-2024-XXXX已验证)
  • 论文AI痕迹重、大面积飘红?从68%到0%:3大工具测评与结构级优化教程
  • LinkSwift:一站式网盘直链下载解决方案完全指南
  • 如何在10分钟内为Unity游戏添加多语言翻译支持:XUnity自动翻译器完全指南
  • 单细胞分析实战:当Seurat的SCTransform遇上Harmony,我的整合流程优化笔记
  • 洛谷P2714 四元组统计 题解 莫比乌斯反演
  • 书匠策AI降重降AIGC全拆解:http://www.shujiangce.com 这个“论文急救站“到底靠不靠谱?
  • 辽宁高质量草坪批发基地实测排行 品质供货全维度对比 - 奔跑123
  • 使用Node.js与Taotoken构建一个简单的多轮对话代理服务
  • 2026年AI智能体大爆发:Claude Code、GPT-5.3、三大Agent实测,哪个真正能替你干活?
  • 深度解析Universal-IFR-Extractor:终极固件内部表单提取技术实战指南
  • 给STM32H7开发者的USB协议栈避坑指南:从硬件选型到代码调试的完整流程
  • 2026年4月行业内评价高的不锈钢法兰厂商推荐,变压器法兰/不锈钢法兰/高温合金法兰,不锈钢法兰生产厂家哪家权威 - 品牌推荐师
  • Pearcleaner:你的macOS数字管家,彻底告别应用残留的终极清理方案
  • 2026年4月工业纸箱联动线公司推荐,纸箱粘钉联动线/工业纸箱联动线,工业纸箱联动线制造厂家口碑推荐 - 品牌推荐师