异步请求数据刷新卡片 和 应用内数据改变同步刷新卡片的实现 原创
前言
下面代码基OpenHarmony API12,在DAYU200运行结果
HarmonyOS 应用如何修改为 OpenHarmony 应用(API12):如何创建卡片:服务卡片开发指南:打造更便捷的用户体验 (基于ArkTs UI 的卡片开发)
面向需求:
- 卡片无法发送网络请求想在卡片中获取接口数据
- 想通过应用数据变化同步卡片数据变化
- 卡片中无法使用延时函数并且卡片动画效果最多持续1秒,想要使用大于1秒的延迟
- 另外 formExtensionAbility 进程不能常驻后台,即在卡片生命周期回调函数中无法处理长时间的任务
结果展示(有点糊hh)
整体思路
- 要通过应用改变卡片数据,那么应用需要获取到卡片ID
- 通过FormExtensionAbility只要知道卡片ID即可更新卡片数据
- 卡片通过call事件和应用UIAbility交互
- @Watch装饰器对状态变量的监听达到改变了就刷新的目的
全部代码,见最后仓库地址
需要如下权限,别忘了加哦
- 异步请求获取数据需要网络权限
- 卡片使用call事件拉起指定UIAbility到后台,需要后台运行权限
entry/src/main/module.json5
一、应用获取并持久化卡片ID
大致流程如下
- 卡片生命周期函数 onAddForm中将卡片 ID传递给卡片
- 卡片通过call事件主动上传卡片 ID到应用UIAbility
- 应用 Aibility 接收卡片 ID并通过用户首选项持久化卡片ID
- 移除卡片时,删除卡片 ID
1、创建卡片时,将卡片 ID传递给卡片
-
获取卡片ID,更新卡片数据
entry/src/main/ets/entryformability/EntryFormAbility.ets
-
卡片接收卡片 ID
entry/src/main/ets/widget/pages/WidgetCard.ets
卡片页面中使用LocalStorageProp装饰需要刷新的卡片数据
-
效果
添加卡片时 添加到桌面后
2、卡片主动上传卡片ID到应用
-
利用 @Watch装饰器对状态变量的监听来触发上传
entry/src/main/ets/widget/pages/WidgetCard.ets
-
在UIAbility中接收call事件并获取参数
entry/src/main/ets/entryability/EntryAbility.ets
3、记录卡片id,持久化存储
-
封装用户首选项工具类
此时接收到卡片 id 后,需要将卡片 id 持久化存储,避免重新打卡手机时,无法联系到已经创建的卡片
entry/src/main/ets/common/FormIdStore.ets
-
初始化并调用用户首选项工具类
onCreate 中初始化
entry/src/main/ets/entryability/EntryAbility.ets
4、移除卡片时,删除卡片 id
卡片生命周期管理在卡片移除时删除持久化的数据即可
entry/src/main/ets/entryformability/EntryFormAbility.ets
二、用异步请求数据刷新卡片
这里使用同步方法模拟异步请求数据,数据分为4天数据,getMsgList方法为获取一天的数据
entry/src/main/ets/DataModel/Data.ets
1、初始化刷新卡片
在2、卡片主动上传卡片ID到应用时将卡片需要更新数据的天数传递给应用UIAbility
entry/src/main/ets/widget/pages/WidgetCard.ets
应用在监听事件接收时通过(模拟)请求获取卡片需要天数数据传递给卡片,通过FormExtensionAbility更新卡片数据
entry/src/main/ets/entryability/EntryAbility.ets
效果展示
entry/src/main/ets/widget/pages/WidgetCard.ets
2、手动刷新数据
设置点击事件,通过调用call触发应用UIAbility的回调,卡片刷新
entry/src/main/ets/widget/pages/WidgetCard.ets
在中专门监听updateCard方法,获取数据并传递给卡片,刷新卡片数据
3、效果展示
4、常见错误
错误1:点击卡片无效,数据没有变化,甚至无法触发任何事件
原因:卡片设置为了静态卡片
修改:将下面目录下isDynamic改为true即可
entry/src/main/resources/base/profile/form_config.json
说明:在API 10及以上 Stage模型的工程中,在Service Widget菜单可直接选择创建动态或静态服务卡片。创建服务卡片后,也可以在卡片的form_config.json配置文件中,通过isDynamic参数修改卡片类型:isDynamic置空或赋值为"true",则该卡片为动态卡片;isDynamic赋值为"false",则该卡片为静态卡片。
更多参考:创建一个ArkTS卡片
错误2:call失效或网络请求无效,没有申请相应权限
entry/src/main/module.json5
按如下添加即可
三、卡片数据跟随应用数据刷新
1、主页实现
看完上面的那么这个就简单了,也能想到怎么处理了吧
通过 @Watch装饰器对状态变量的监听来触发卡片刷新(因为我们已经获取到并存储了卡片ID),就这么简单!
最后就直接贴代码了,效果见文章开头
entry/src/main/ets/pages/Index.ets
2、总结
代码已经推到仓库,欢迎大家下载尝试
仓库地址:CardData · AtomGit_开放原子开源基金会代码托管平台
写的太有水平啦,一看就是高手
666,这个入是桂