HarmonyOS4.0系统性深入开发13根据卡片状态刷新不同内容

根据卡片状态刷新不同内容

相同的卡片可以添加到桌面上实现不同的功能,比如添加两张桌面的卡片,一张显示杭州的天气,一张显示北京的天气,设置每天早上7点触发定时刷新,卡片需要感知当前的配置是杭州还是北京,然后将对应城市的天气信息刷新到卡片上,以下示例介绍了如何根据卡片的状态动态选择需要刷新的内容。

  • 卡片配置文件:配置每天早上7点触发定时刷新

    {"forms": [{"name": "widget","description": "This is a service widget.","src": "./ets/widget/pages/WidgetCard.ets","uiSyntax": "arkts","window": {"designWidth": 720,"autoDesignWidth": true},"colorMode": "auto","isDefault": true,"updateEnabled": true,"scheduledUpdateTime": "07:00","updateDuration": 0,"defaultDimension": "2*2","supportDimensions": ["2*2"]}]
    }
    
  • 卡片页面:卡片具备不同的状态选择,在不同的状态下需要刷新不同的内容,因此在状态发生变化时通过postCardAction通知EntryFormAbility。

    let storage = new LocalStorage();
    @Entry(storage)
    @Component
    struct WidgetCard {@LocalStorageProp('textA') textA: string = '待刷新...';@LocalStorageProp('textB') textB: string = '待刷新...';@State selectA: boolean = false;@State selectB: boolean = false;build() {Column() {Row() {Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }).select(false).onChange((value: boolean) => {this.selectA = value;postCardAction(this, {'action': 'message','params': {'selectA': JSON.stringify(value)}});})Text('状态A')}Row() {Checkbox({ name: 'checkbox2', group: 'checkboxGroup' }).select(false).onChange((value: boolean) => {this.selectB = value;postCardAction(this, {'action': 'message','params': {'selectB': JSON.stringify(value)}});})Text('状态B')}Row() { // 选中状态A才会进行刷新的内容Text('状态A: ')Text(this.textA)}Row() { // 选中状态B才会进行刷新的内容Text('状态B: ')Text(this.textB)}}.padding('10%')}
    }
    
  • EntryFormAbility:将卡片的状态存储在本地数据库中,在刷新事件回调触发时,通过formId获取当前卡片的状态,然后根据卡片的状态选择不同的刷新内容。

    import formInfo from '@ohos.app.form.formInfo'
    import formProvider from '@ohos.app.form.formProvider';
    import formBindingData from '@ohos.app.form.formBindingData';
    import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
    import dataStorage from '@ohos.data.storage'export default class EntryFormAbility extends FormExtensionAbility {onAddForm(want) {let formId = want.parameters[formInfo.FormParam.IDENTITY_KEY];let isTempCard: boolean = want.parameters[formInfo.FormParam.TEMPORARY_KEY];if (isTempCard === false) { // 如果为常态卡片,直接进行信息持久化console.info('Not temp card, init db for:' + formId);let storeDB = dataStorage.getStorageSync(this.context.filesDir + 'myStore')storeDB.putSync('A' + formId, 'false');storeDB.putSync('B' + formId, 'false');storeDB.flushSync();}let formData = {};return formBindingData.createFormBindingData(formData);}onRemoveForm(formId) {console.info('onRemoveForm, formId:' + formId);let storeDB = dataStorage.getStorageSync(this.context.filesDir + 'myStore')storeDB.deleteSync('A' + formId);storeDB.deleteSync('B' + formId);}// 如果在添加时为临时卡片,则建议转为常态卡片时进行信息持久化onCastToNormalForm(formId) {console.info('onCastToNormalForm, formId:' + formId);let storeDB = dataStorage.getStorageSync(this.context.filesDir + 'myStore')storeDB.putSync('A' + formId, 'false');storeDB.putSync('B' + formId, 'false');storeDB.flushSync();}onUpdateForm(formId) {let storeDB = dataStorage.getStorageSync(this.context.filesDir + 'myStore')let stateA = storeDB.getSync('A' + formId, 'false').toString()let stateB = storeDB.getSync('B' + formId, 'false').toString()// A状态选中则更新textAif (stateA === 'true') {let formInfo = formBindingData.createFormBindingData({'textA': 'AAA'})formProvider.updateForm(formId, formInfo)}// B状态选中则更新textBif (stateB === 'true') {let formInfo = formBindingData.createFormBindingData({'textB': 'BBB'})formProvider.updateForm(formId, formInfo)}}onFormEvent(formId, message) {// 存放卡片状态console.info('onFormEvent formId:' + formId + 'msg:' + message);let storeDB = dataStorage.getStorageSync(this.context.filesDir + 'myStore')let msg = JSON.parse(message)if (msg.selectA != undefined) {console.info('onFormEvent selectA info:' + msg.selectA);storeDB.putSync('A' + formId, msg.selectA);}if (msg.selectB != undefined) {console.info('onFormEvent selectB info:' + msg.selectB);storeDB.putSync('B' + formId, msg.selectB);}storeDB.flushSync();}
    };
    

说明

通过本地数据库进行卡片信息的持久化时,建议先在onAddForm生命周期中通过TEMPORARY_KEY判断当前添加的卡片是否为常态卡片:如果是常态卡片,则直接进行卡片信息持久化;如果为临时卡片,则可以在卡片转为常态卡片(onCastToNormalForm)时进行持久化;同时需要在卡片销毁(onRemoveForm)时删除当前卡片存储的持久化信息,避免反复添加删除卡片导致数据库文件持续变大。

使用方刷新卡片内容(仅对系统应用开放)

当使用方添加了一些周期性刷新的卡片后,由于周期性刷新的时间间隔限制,可以在使用方中提供按钮主动触发卡片的刷新。这种场景下使用方可以通过调用requestForm接口请求卡片刷新,系统会调用卡片提供方FormExtensionAbility中的onUpdateForm生命周期回调,在回调中,可以使用updateForm接口刷新卡片内容。onUpdateForm生命周期回调参考通过FormExtensionAbility刷新卡片内容。

import formHost from '@ohos.app.form.formHost';@Entry()
@Component
struct WidgetCard {formId = ...; // 卡片IDbuild() {Button(`刷新卡片`).type(ButtonType.Capsule).width('50%').height(50).onClick(() => {console.info('FormAbility update form click');// formId需要为实际需要刷新的卡片IDformHost.requestForm(this.formId.toString()).then(() => {console.info('Succeeded in requestForming.');});})...}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机创新协会冬令营——暴力枚举题目06

我给大家第一阶段的最后一道题就到这里了,下次得过段时间了。所以这道题简单一点。但是足够经典 下述题目描述和示例均来自力扣:两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target …

Transformer简略了解

Transformer出自论文:《Attention Is All You Need》 该论文的提出,对RNN循环神经网络产生了冲击,席卷了自然语言处理(NLP)领域,后续的GPT4.0版本也是根据其进行训练优化的 一、Transformer主体架构 可以简化分为Encoders和Decod…

nginx部署前端项目自动化脚本

文章目录 配置入口服务器nginx的conf.d使用docker创建一个nginx配置自动化脚本 前言 将项目 通过nginx 部署到 新的服务器 通过nginx反向代理出去 配置入口服务器nginx的conf.d 一般在这个文件夹下 找不到使用 find / -name nginx 2>/dev/null 找到nginx 的位置如果有些没有…

WPF 导航界面悬浮两行之间的卡片 漂亮的卡片导航界面 WPF漂亮渐变颜色 WPF漂亮导航头界面 UniformGrid漂亮展现

在现代应用程序设计中,一个漂亮的WPF导航界面不仅为用户提供视觉上的享受,更对提升用户体验、增强功能可发现性和应用整体效率起到至关重要的作用。以下是对WPF漂亮导航界面重要性的详尽介绍: 首先,引人入胜的首页界面是用户与软…

QLabel文字两端对齐解决方案

QLabel文字两端对齐解决方案 Qt本身是支持文字两端对齐的,但需要同时使用Qt::AlignJustify和Qt::TextJustificationForced两个设置。但这两个设置入口不一样。 Qt::AlignJustify用于setAlignment、setTextAlignment等接口,Qt::TextJustificationForced…

【Flet教程】使用Flet以Python创建TODO应用程序

Flet是基于Python实现的Flutter图形界面GUI。除了使用Python,具备美观、简洁、易用,还有Flutter本身的跨平台(安卓、iOS、Win、Mac、Web)、高性能、有后盾的特点。下面是0.18版官方TODO APP教程,为了准确,保…

Hyperledger Fabric Java App Demo

编写一个应用程序来连接到 fabrc 网络中,通过调用智能合约来访问账本. fabric gateway fabric gateway 有两个项目,一个是 fabric-gateway-java , 一个是 fabric-gateway。 fabric-gateway-java 是比较早的项目,使用起来较为麻烦需要提供一…

shell中的正则表达式、编程-grep、编程-SED、以及编程-AWK

正则表达式RE 用来处理文本 正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间; 例如/l[oO]ve/就是由正斜杠界定的正则表达式, 它将匹配被查找的行中任何位置出现的相同模式. 在正则表达…

SpringBoot 如何 配置端口号

结论 server:port: 8088演示 [Ref] 快速构建SpringBoot项目

是时候扔掉cmder, 换上Windows Terminal

作为一个Windows的长期用户,一直没有给款好用的终端,知道遇到了 cmder,它拯救一个习惯用Windows敲shell命令的人。 不用跟我安利macOS真香!公司上班一直用macOS,一方面确实更加习惯windows下面学习, 另一方面是上课需要…

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展,web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求,许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西,…

Go语言学习记录——用正则表达式(regexp包)来校验参数

前言 最近坐毕设ing,简单的一个管理系统。 其中对于用户注册、登录功能,需要进行一些参数校验。 因为之前使用过,因此这里计划使用正则表达式进行校验。但是之前的使用也仅限于使用,因此这次专门进行一次学习,并做此记…

Python将Labelme文件的真实框和预测框绘制到图片上

Python将Labelme文件的真实框和预测框绘制到图片上 前言前提条件相关介绍实验环境Python将Labelme文件的标注信息绘制到图片上代码实现输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入Python日常小操作专…

ROS 摄像头的标定

在ROS中,标定摄像头是一个重要的步骤,它是为了获取摄像头的内参和外参,进而提高摄像头的定位精度。摄像头标定校正由镜头畸变、相机内参(焦距、主点坐标等)、相机外参(旋转和平移矩阵)等因素引起…

js 节流和防抖

1 节流 可以形象理解为“节约流量”防止事件高频触发 作用 将高频触发变为低频触发 场景 降低resize等事件触发频率无限加载场景下,定期触发 代码 function throttle(fn, delay 100) {let timer null;return function() {if (timer) return;timer setTime…

leetcode每日一题43

116. 填充每个节点的下一个右侧节点指针 层序遍历嘛 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(N…

深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

为什么要看源码: 1、提升技术功底: 学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提升自己的技术功底 2、深度掌握技术框架: 源码看多了,对于一个新技术…

猫头虎分享已解决Bug || Error: ImagePullBackOff (K8s)

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

快速幂算法总结

知识概览 快速幂可以在O(logk)的时间复杂度之内求出来的结果。 例题展示 快速幂 题目链接 活动 - AcWing 系统讲解常用算法与数据结构,给出相应代码模板,并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/877/ 代码 #inc…

电子学会2023年12月青少年软件编程(图形化)等级考试试卷(一级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(一级) 分数:100 题数:37 一、单选题(共25题,共50分) 1. 观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?( )