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

鸿蒙HarmonyOS开发:如何灵活运用服务卡片提升用户体验

文章目录

      • 一、ArkTS卡片相关模块
      • 二、卡片事件能力说明
      • 三、卡片事件的主要使用场景
        • 3.1、使用router事件跳转到指定UIAbility
          • 3.1.1、卡片内按钮跳转到应用的不同页面
          • 3.1.2、服务卡片的点击跳转事件
        • 3.2、通过message事件刷新卡片内容
          • 3.2.1、在卡片页面调用postCardAction接口触发message事件
          • 3.2.2、onFormEvent生命周期中调用updateForm接口刷新卡片
          • 3.2.2、运行效果如下图所示

一、ArkTS卡片相关模块

在这里插入图片描述

ArkTS卡片创建完成后,工程中会新增如下卡片相关文件:卡片生命周期管理文件(EntryFormAbility.ets)、卡片页面文件(WidgetCard.ets)和卡片配置文件(form_config.json)。

在这里插入图片描述

二、卡片事件能力说明

ArkTS卡片中提供了postCardAction接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。

在这里插入图片描述

三、卡片事件的主要使用场景

  • router事件:可以使用router事件跳转到指定UIAbility,并通过router事件刷新卡片内容。

  • call事件:可以使用call事件拉起指定UIAbility到后台,并通过call事件刷新卡片内容。

  • message事件:可以使用message拉起FormExtensionAbility,并通过FormExtensionAbility刷新卡片内容。

3.1、使用router事件跳转到指定UIAbility

在卡片中使用postCardAction接口的router能力,能够快速拉起卡片提供方应用的指定UIAbility,因此UIAbility较多的应用往往会通过卡片提供不同的跳转按钮,实现一键直达的效果。

3.1.1、卡片内按钮跳转到应用的不同页面

在UIAbility中接收router事件并获取参数,根据传递的params不同,选择拉起不同的页面。

// Entryability.ts

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {// 服务卡片跳转的页面private selectPage: string = '';//当前windowStageprivate currentWindowStage: window.WindowStage | null = null;// 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调onCreate(want, launchParam) {// 获取router事件中传递的targetPage参数if (want.parameters !== undefined && want.parameters.params) {let params = JSON.parse(want.parameters.params)this.selectPage = params.targetPage}}// 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调onNewWant(want, launchParam) {// 获取router事件中传递的targetPage参数if (want.parameters !== undefined && want.parameters.params) {let params = JSON.parse(want.parameters.params)this.selectPage = params.targetPage}this.onWindowStageCreate(this.currentWindowStage)}// 创建主窗口,为此功能设置主页onWindowStageCreate(windowStage: window.WindowStage) {let targetPage = this.selectPage || "Index"targetPage = "pages/" + targetPage// 为currentWindowStage赋值if (this.currentWindowStage === null) {this.currentWindowStage = windowStage;}windowStage.loadContent(targetPage, (err, data) => {if (err.code) {hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');return;}hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');});}
}
3.1.2、服务卡片的点击跳转事件

在卡片页面中布局两个按钮,点击其中一个按钮时调用postCardAction向指定UIAbility发送router事件,并在事件内定义需要传递的内容。

// WidgetCard.ets

@Entry
@Component
struct WidgetCard {build() {Column(){Button("个人中心").onClick(() => {postCardAction(this, {"action": "router","abilityName": "EntryAbility","params": {"targetPage": "Personals"}});})Button("消息列表").onClick(() => {postCardAction(this, {"action": "router","abilityName": "EntryAbility","params": {"targetPage": "Message"}});})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}
3.2、通过message事件刷新卡片内容

在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility,然后由FormExtensionAbility刷新卡片内容。

3.2.1、在卡片页面调用postCardAction接口触发message事件

在卡片页面通过注册Button的onClick点击事件回调,并在回调中调用postCardAction接口触发message事件拉起FormExtensionAbility。卡片页面中使用LocalStorageProp装饰需要刷新的卡片数据。

// WidgetCard.ets

let storageUpdateByMsg = new LocalStorage();@Entry(storageUpdateByMsg)
@Component
struct UpdateByMessageCard {@LocalStorageProp('title') title: ResourceStr = 'title';@LocalStorageProp('detail') detail: ResourceStr = 'detail';build() {Column() {Text(this.title)Text(this.detail)Button("刷新数据").onClick(() => {postCardAction(this, {"action": "message","params": {"msgTest": "messageEvent"}});})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}
3.2.2、onFormEvent生命周期中调用updateForm接口刷新卡片

在FormExtensionAbility的onFormEvent生命周期中调用updateForm接口刷新卡片。

// EntryFormAbility.ts

import formInfo from '@ohos.app.form.formInfo';
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 {onAddForm(want) {// Called to return a FormBindingData object.let formData = {};return formBindingData.createFormBindingData(formData);}onFormEvent(formId, message) {class FormDataClass {title: string = 'Title Update.'; // 和卡片布局中对应detail: string = 'Description update success.'; // 和卡片布局中对应}let formData = new FormDataClass();let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(formData);formProvider.updateForm(formId, formInfo).then(() => {}).catch((error) => {})}};
3.2.2、运行效果如下图所示

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DMA简述与使用实例
  • [译] RAGFlow 使用说明
  • yield 详解
  • 基于Material Design风格开源的Avalonia UI控件库
  • 鸿蒙OS试题(4)
  • Docker深度探索:精通容器化的未来技术
  • 【NO.15】LeetCode经典150题-135. 分发糖果
  • C#高效内存管理:运用对象池与结构体优化技术
  • 文件上传的学习
  • 功能强大的开源数据中台系统 DataCap 2024.03.9 发布
  • 理解 Maven 依赖范围及编译与运行时的需求
  • C#文件的输入和输出
  • 产品入门篇笔记
  • 2024年国家自然科学基金即将公布,如何第一时间知道评审结果?
  • priority_queue的使用方法
  • ES6指北【2】—— 箭头函数
  • JavaScript-如何实现克隆(clone)函数
  • echarts花样作死的坑
  • IP路由与转发
  • orm2 中文文档 3.1 模型属性
  • PAT A1017 优先队列
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Sublime text 3 3103 注册码
  • 分布式熔断降级平台aegis
  • 来,膜拜下android roadmap,强大的执行力
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 探索 JS 中的模块化
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 责任链模式的两种实现
  • 白色的风信子
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • #QT(TCP网络编程-服务端)
  • (06)Hive——正则表达式
  • (NSDate) 时间 (time )比较
  • (二)原生js案例之数码时钟计时
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (九十四)函数和二维数组
  • (十)T检验-第一部分
  • (一)kafka实战——kafka源码编译启动
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ****Linux下Mysql的安装和配置
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 5种线程安全集合
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET/C# 使用反射注册事件
  • .net访问oracle数据库性能问题
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET命名规范和开发约定
  • .py文件应该怎样打开?
  • .ui文件相关
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /bin/bash^M: bad interpreter: No such file or directory