HarmonyOS4.0系统性深入开发11通过message事件刷新卡片内容

通过message事件刷新卡片内容

在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility,然后由FormExtensionAbility刷新卡片内容,下面是这种刷新方式的简单示例。

  • 在卡片页面通过注册Button的onClick点击事件回调,并在回调中调用

    postCardAction

    接口触发message事件拉起FormExtensionAbility。

    let storage = new LocalStorage();@Entry(storage)
    @Component
    struct WidgetCard {@LocalStorageProp('title') title: string = 'init';@LocalStorageProp('detail') detail: string = 'init';build() {Column() {Button('刷新').onClick(() => {postCardAction(this, {'action': 'message','params': {'msgTest': 'messageEvent'}});})Text(`${this.title}`)Text(`${this.detail}`)}.width('100%').height('100%')}
    }
    
  • 在FormExtensionAbility的onFormEvent生命周期中调用updateForm接口刷新卡片。

    import formBindingData from '@ohos.app.form.formBindingData';
    import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
    import formProvider from '@ohos.app.form.formProvider';export default class EntryFormAbility extends FormExtensionAbility {onFormEvent(formId, message) {// Called when a specified message event defined by the form provider is triggered.console.info(`FormAbility onEvent, formId = ${formId}, message: ${JSON.stringify(message)}`);let formData = {'title': 'Title Update Success.', // 和卡片布局中对应'detail': 'Detail Update Success.', // 和卡片布局中对应};let formInfo = formBindingData.createFormBindingData(formData)formProvider.updateForm(formId, formInfo).then((data) => {console.info('FormAbility updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('FormAbility updateForm failed: ' + JSON.stringify(error));})}...
    }
    

    运行效果如下图所示。

    点击放大

通过router或call事件刷新卡片内容

在卡片页面中可以通过postCardAction接口触发router或call事件拉起UIAbility,然后由UIAbility刷新卡片内容,下面是这种刷新方式的简单示例。

通过router事件刷新卡片内容

  • 在卡片页面通过注册Button的onClick点击事件回调,并在回调中调用

    postCardAction

    接口触发router事件拉起UIAbility。

    let storage = new LocalStorage();@Entry(storage)
    @Component
    struct WidgetCard {@LocalStorageProp('detail') detail: string = 'init';build() {Column() {Button('跳转').margin('20%').onClick(() => {console.info('postCardAction to EntryAbility');postCardAction(this, {'action': 'router','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'detail': 'RouterFromCard'}});})Text(`${this.detail}`).margin('20%')}.width('100%').height('100%')}
    }
    
  • 在UIAbility的onCreate()或者onNewWant()生命周期中可以通过入参want获取卡片的formID和传递过来的参数信息,然后调用updateForm接口刷新卡片。

    import UIAbility from '@ohos.app.ability.UIAbility';
    import formBindingData from '@ohos.app.form.formBindingData';
    import formProvider from '@ohos.app.form.formProvider';
    import formInfo from '@ohos.app.form.formInfo';export default class EntryAbility extends UIAbility {// 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调onCreate(want, launchParam) {console.info('Want:' + JSON.stringify(want));if (want.parameters[formInfo.FormParam.IDENTITY_KEY] !== undefined) {let curFormId = want.parameters[formInfo.FormParam.IDENTITY_KEY];let message = JSON.parse(want.parameters.params).detail;console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);let formData = {"detail": message + ': onCreate UIAbility.', // 和卡片布局中对应};let formMsg = formBindingData.createFormBindingData(formData)formProvider.updateForm(curFormId, formMsg).then((data) => {console.info('updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('updateForm failed:' + JSON.stringify(error));})}}// 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调onNewWant(want, launchParam) {console.info('onNewWant Want:' + JSON.stringify(want));if (want.parameters[formInfo.FormParam.IDENTITY_KEY] !== undefined) {let curFormId = want.parameters[formInfo.FormParam.IDENTITY_KEY];let message = JSON.parse(want.parameters.params).detail;console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);let formData = {"detail": message + ': onNewWant UIAbility.', // 和卡片布局中对应};let formMsg = formBindingData.createFormBindingData(formData)formProvider.updateForm(curFormId, formMsg).then((data) => {console.info('updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('updateForm failed:' + JSON.stringify(error));})}}...
    }
    

通过call事件刷新卡片内容

  • 在使用

    postCardAction

    接口的call事件时,需要在FormExtensionAbility中的onAddForm生命周期回调中更新formId。

    import formBindingData from '@ohos.app.form.formBindingData'; 
    import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';export default class EntryFormAbility extends FormExtensionAbility {onAddForm(want) {let formId = want.parameters["ohos.extra.param.key.form_identity"];let dataObj1 = {"formId": formId};let obj1 = formBindingData.createFormBindingData(dataObj1);return obj1;}...
    };
    
  • 在卡片页面通过注册Button的onClick点击事件回调,并在回调中调用

    postCardAction

    接口触发call事件拉起UIAbility。

    let storage = new LocalStorage();@Entry(storage)
    @Component
    struct WidgetCard {@LocalStorageProp('detail') detail: string = 'init';@LocalStorageProp('formId') formId: string = '0';build() {Column() {Button('拉至后台').margin('20%').onClick(() => {console.info('postCardAction to EntryAbility');postCardAction(this, {'action': 'call','abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility'params': {'method': 'funA','formId': this.formId,'detail': 'CallFromCard'}});})Text(`${this.detail}`).margin('20%')}.width('100%').height('100%')}
    }
    
  • 在UIAbility的onCreate生命周期中监听call事件所需的方法,然后调用updateForm接口刷新卡片。

    import UIAbility from '@ohos.app.ability.UIAbility';
    import formBindingData from '@ohos.app.form.formBindingData';
    import formProvider from '@ohos.app.form.formProvider';
    import formInfo from '@ohos.app.form.formInfo';
    const MSG_SEND_METHOD: string = 'funA'// 在收到call事件后会触发callee监听的方法
    function FunACall(data) {// 获取call事件中传递的所有参数let params = JSON.parse(data.readString())if (params.formId !== undefined) {let curFormId = params.formId;let message = params.detail;console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);let formData = {"detail": message};let formMsg = formBindingData.createFormBindingData(formData)formProvider.updateForm(curFormId, formMsg).then((data) => {console.info('updateForm success.' + JSON.stringify(data));}).catch((error) => {console.error('updateForm failed:' + JSON.stringify(error));})}return null;
    }
    export default class EntryAbility extends UIAbility {// 如果UIAbility第一次启动,call事件后会触发onCreate生命周期回调onCreate(want, launchParam) {console.info('Want:' + JSON.stringify(want));try {// 监听call事件所需的方法this.callee.on(MSG_SEND_METHOD, FunACall);} catch (error) {console.log(`${MSG_SEND_METHOD} register failed with error ${JSON.stringify(error)}`)}}...
    }
    

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

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

相关文章

数据库中的时间和前台展示的时间不一样,如何保存日期格式的数据到数据库? 如何展示数据库的日期数据到前台

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) ✈️公众号 | 热爱技术的小郑 文章底部有个人公众号二维码。回复 Java全套视频教程 或 前端全套视频教程 即可获取 300G 教程资料…

【深入浅出RocketMQ原理及实战】「云原生升级系列」打造新一代云原生“消息、事件、流“统一消息引擎的融合处理平台

打造新一代云原生"消息、事件、流"统一消息引擎的融合处理平台 云原生架构RocketMQ的云原生架构实现RocketMQ的云原生发展历程互联网时期的诞生无法支持云原生的能力 云原生阶段的升级云原生升级方向促进了Mesh以及多语言化发展可分合化的存算分离架构存储分离架构的…

听GPT 讲Rust源代码--library/portable-simd

File: rust/library/portable-simd/crates/core_simd/examples/spectral_norm.rs spectral_norm.rs是一个示例程序,它展示了如何使用Portable SIMD库中的SIMD(Single Instruction Multiple Data)功能来实现频谱规范化算法。该示例程序是Rust源…

跟着cherno手搓游戏引擎【2】:日志系统spdlog和premake的使用

配置: 日志库文件github: GitHub - gabime/spdlog: Fast C logging library. 新建vendor文件夹 将下载好的spdlog放入 配置YOTOEngine的附加包含目录: 配置Sandbox的附加包含目录: 包装spdlog: 在YOTO文件夹下创建…

在Django中配置PostgreSQL

下载并安装PostgreSQL PostgreSQL: Downloads 安装依赖psycopg2 python -m pip install psycopg2 修改Django配置文件settings.py 📌编辑 mysite/settings.py 文件前,先设置 TIME_ZONE 为你自己时区。 LANGUAGE_CODE zh-Hans TIME_ZONE Asia/Shang…

【Elasticsearch源码】 分片恢复分析

带着疑问学源码,第七篇:Elasticsearch 分片恢复分析 代码分析基于:https://github.com/jiankunking/elasticsearch Elasticsearch 8.0.0-SNAPSHOT 目的 在看源码之前先梳理一下,自己对于分片恢复的疑问点: 网上对于E…

【基础】【Python网络爬虫】【12.App抓包】reqable 安装与配置(附大量案例代码)(建议收藏)

Python网络爬虫基础 App抓包1. App爬虫原理2. reqable 的安装与配置reqable 安装教程reqable 的配置 3. 模拟器的安装与配置夜神模拟器的安装夜神模拟器的配置配置代理配置证书 4. 内联调试及注意事项软件启动顺开启抓包功reqable面板功列表部件功能列表数据快捷操作栏 夜神模拟…

WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

文章目录 前言相关链接项目专栏运行环境匹配图片矩形鼠标绘制Halcon添加右键事件Task封装运行结果个人引用问题原因推测 圆形鼠标绘制代码运行结果 课程完结: 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视…

【java爬虫】股票数据获取工具前后端代码

前面我们有好多文章都是在介绍股票数据获取工具,这是一个前后端分离项目 后端技术栈:springboot,sqlite,jdbcTemplate,okhttp 前端技术栈:vue,element-plus,echarts,ax…

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相…

在线智能防雷监控检测系统应用方案

在线智能防雷监控检测系统是一种利用现代信息技术,对防雷设施的运行状态进行实时监测、管理和控制的系统,它可以有效提高防雷保护的安全性、可靠性和智能化程度,降低运维成本和风险,为用户提供全方位的防雷解决方案。 地凯科技在…

排序算法之计数排序

计数排序是一种非基于比较的排序算法,它通过统计数组中每个元素出现的次数,将其按次数从小到大排序。 以下是计数排序的基本步骤: 统计:统计数组中每个元素出现的次数。计数:将每个元素的出现次数存储在另一个数组中…

redisson作为分布式锁的底层实现

1. redisson如何实现尝试获取锁的逻辑 如何实现在一段的时间内不断的尝试获取锁 其实就是搞了个while循环,不断的去尝试获取锁资源。但是因为latch的存在会在给定的时间内处于休眠状态。这个事件,监听的是解锁动作,如果解锁动作发生。会调用…

Android textview展示富文本内容

今天实现的内容,就是上图的效果,通过Span方式展示图片,需要支持文字颜色改变、加粗。支持style\"color:green; font-weight:bold;\"展示。尤其style标签中的font-size、font-weight是在原生中不被支持的。 所以我们今天需要使用自…

病情聊天机器人,利用Neo4j图数据库和Elasticsearch全文搜索引擎相结合

项目设计目的: 本项目旨在开发一个病情聊天机器人,利用Neo4j图数据库和Elasticsearch全文搜索引擎相结合,实现对病情相关数据的存储、查询和自动回答。通过与用户的交互,机器人可以根据用户提供的症状描述,给出初步的可…

字母简化(UPC练习)

题目描述 给出一串全部为小写英文字母的字符串,要求把这串字母简化。简化规则是:统计连续出现的字母数,输出时先输出个数,再输出字母。比如:aaabbbaa,则简化为3a3b2a;而zzzzeeeeea,…

帆软报表中定时调度中的最后一步如何增加新的处理方式

在定时调度中,到调度执行完之后,我们可能想做一些别的事情,当自带的处理方式不满足时,可以自定义自己的处理方式。 产品的处理方式一共有如下这些类型: 我们想在除了上面的处理方式之外增加自己的处理方式应该怎么做呢? 先看下效果: 涉及到两方面的改造,前端与后端。…

前端算法之二叉树

二叉树 二叉树用于解决什么问题 数据的组织与搜索:排序:表达式和计算:图形处理: 举例:二叉树的最近公共祖先 思路: 排序/排布方式 和 (排序中)当前树和节点的关系 举例2:…

光照贴图的参数化

正如Jon在上一篇文章中所解释的那样,我们在《见证者》中使用了预先计算的全局照明,而我的首要任务之一就是开发该系统。 我开发了一些有趣的技术来计算自动参数化,以一种可以轻松映射到 GPU 的方式制定照明计算,并通过使用辐照度…

【如何选择Mysql服务器的CPU核数及内存大小】

文章目录 🔊博主介绍🥤本文内容📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…