【HarmonyOS Next】鸿蒙应用实现弹框DialogHub详解

devtools/2025/3/20 17:13:42/

【HarmonyOS Next】鸿蒙应用实现弹框DialogHub详解

一、前言

鸿蒙中实现弹框目前官方提供openCustomDialog和CustomDialog两种模式。推荐前者,详情见下图和官网文档链接:
在这里插入图片描述
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-uicontext-custom-dialog-V14
UI强绑定的实现方式API已标注不推荐。推荐使用UI框架层预留挂靠节点的方式,即openCustomDialog。

这两者的差别详见【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(一)

除此之外开源三方库DialogHub可以更加快捷的使用弹窗:
在这里插入图片描述
https://gitee.com/hadss/dialoghub

DialogHub底层实现原理为,使用浮层OverlayManager➕半模态页面bindSheet来实现弹框
可以达到我们在传统Android和IOS开发中,弹框与页面生命周期绑定的效果(页面隐藏,弹框隐藏。页面销毁,弹框销毁)

DialogHub接口属性详细信息如下:
https://gitee.com/hadss/dialoghub/blob/master/docs/Reference.md
在这里插入图片描述

二、DialogHub的使用

目前DialogHub还是RC版本,并非Final版本。请谨慎使用。

目前DialogHub可以实现的弹框效果如下:
在这里插入图片描述
使用起来很简单,通过三方库通过级联的方式,获取弹框实例对象,设置弹框的样式,布局,和弹框上的属性。甚至连弹框内容模板的设置和数据的更新也通过级联属性设置,这个思路不错。

// 导依赖包之后就可操作DialogHub对象
import {DialogHub
} from "@hadss/dialoghub"

在这里插入图片描述
如图所示,红框中提供了默认的三种样式的弹框以Toast弹框举例:

  showToastTest(){DialogHub.getToast().setContent(wrapBuilder(TextToastBuilder))// 自定义内容					.setConfig(CommonConstant.CUSTOM_SAMPLE_CONFIG)// 持续时间			.setDuration(CommonConstant.DURATION_3000).build().show();}// 布局的内容TextToastBuilder() {Stack() {Text("测试文本").fontColor(Color.Black).fontSize(52)}.padding({ left: 20, right: 20 }).height(100)}

自定义弹框

        this.specifiedLocationDialog = this.specifiedLocationDialog ?? DialogHub.getCustomDialog().setOperableContent(wrapBuilder(SnackbarBuilder), (action: DialogAction) => {let param = new SnackbarParams(() => {action.dismiss()}, this.pageInfos)return param})// DocsDot.setStyle({radius: $r('app.float.custom_template_sample_radius'),shadow: CommonConstant.CUSTOM_SAMPLE_STYLE_SHADOW})// DocsDot.setConfig({dialogBehavior: { isModal: false, passThroughGesture: true },dialogPosition: {alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: $r('app.float.specified_location_offset') }}}).build();this.specifiedLocationDialog.show();

更新弹框内容:

   let intervalID: number = -1;let time: number = CommonConstant.TIMED_DIALOG_DURATION;let params: TimeToastParams =new TimeToastParams(CommonConstant.TIMED_DIALOG, time + CommonConstant.TIMED_CLOSED);// DocsCode 5this.intervalsDisappearsDialog = this.intervalsDisappearsDialog ?? DialogHub.getCustomDialog().setContent(wrapBuilder(TimeToastBuilder), params).setStyle({radius: $r('app.float.popup_disappears_intervals_radius'),shadow: CommonConstant.CUSTOM_SAMPLE_STYLE_SHADOW}).setAnimation({ dialogAnimation: AnimationType.UP_DOWN }).setConfig({dialogBehavior: { isModal: false, passThroughGesture: true },dialogPosition: {alignment: DialogAlignment.Top,offset: { dy: $r('app.float.popup_disappears_intervals_offset'), dx: 0 }}}).build();this.intervalsDisappearsDialog.show();intervalID = setInterval(() => {time -= 1;params.content = time + CommonConstant.TIMED_CLOSED;this.intervalsDisappearsDialog?.updateContent(params)if (time <= 0 && intervalID) {this.intervalsDisappearsDialog?.dismiss();clearInterval(intervalID);}}, CommonConstant.DURATION_1000);

三、源码示例

首先配置依赖:

{"modelVersion": "5.0.0","description": "Please describe the basic information.","dependencies": {"@hadss/dialoghub": "^1.0.0-rc.1"},"devDependencies": {"@ohos/hypium": "1.0.19","@ohos/hamock": "1.0.0"},"dynamicDependencies": {}
}

之后导入包,进行调用:

import { DialogHub } from '@hadss/dialoghub';
import { getContext } from '@ohos.app.ability';
import CommonConstant from '../utils/CommonConstant';// 假设的 TextToastParams 类型
interface TextToastParams {title?: string;
}// TextToastBuilder 构建器函数

export function TextToastBuilder(param: TextToastParams) {Stack() {Text(param?.title ?? CommonConstant.PURE_TEXT).fontColor($r('app.color.item_text_color')).fontSize($r('app.float.font_size_regular'))}.padding({ left: $r('app.float.text_toast_padding'), right: $r('app.float.text_toast_padding') }).height($r('app.float.text_toast_height'))
}// 假设的组件扩展,用于按钮样式
(Button)
function superFancyButton() {return this.width(CommonConstant.FULL_LENGTH).height($r('app.float.index_action_height')).margin({ bottom: $r('app.float.index_action_margin') }).fontSize($r('app.float.font_size_medium')).fontWeight(FontWeight.Medium).backgroundColor($r('app.color.base_blue'));
}

struct DialogHubExample {// 获取 UI 上下文getUIContext() {return getContext();}aboutToAppear(): void {// 初始化 DialogHubDialogHub.init(this.getUIContext());// 开启日志DialogHub.openLog('DEBUG');// 创建自定义模板DialogHub.createCustomTemplate(CommonConstant.CUSTOM_TEMPLATE_SIMPLE).setContent(wrapBuilder(TextToastBuilder)).setStyle({ backgroundColor: Color.White }).setConfig({ dialogBehavior: { passThroughGesture: true, isModal: false } }).register();}showCustomDialog() {// 显示自定义模板的弹框DialogHub.show({templateName: CommonConstant.CUSTOM_TEMPLATE_SIMPLE,data: {// 传递数据给弹框title: '这是自定义弹框的标题'}});}build() {Column({ space: 20 }) {Button('显示自定义弹框', { stateEffect: true, type: ButtonType.Capsule }).superFancyButton().onClick(() => {this.showCustomDialog();});}.width('100%').height('100%').padding({ top: 20, bottom: 20, left: 20, right: 20 });}
}

http://www.ppmy.cn/devtools/168676.html

相关文章

MATLAB深度极限学习机

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 参考[1]魏洁.深度极限学习机的研究与应用[D].太原理工大学[2023-10-14].DOI:CNKI:CDMD:2.1016.714596. 目录 0.引言 1.ELM-AE实现 2.DELM实现 3.主程序 4.结尾 0.引言 深度极限学习机(DELM)目前主…

【数据分享】1999—2023年地级市固定资产投资和对外经济贸易数据(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据、社会消费品零售总额和年末金融机构存贷款余额、各类用地面积、地方一般公共预算…

PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例&#xff0c;比如一个视窗的场景底图是一个QGraphicsPixmapItem&#xff0c;需要修改它的鼠标滚轮事件&#xff0c;以实现鼠标滚轮缩放显示的功能。为了达到这个目的&#xff0c;可以重新定义一个QGraphicsPixmapItem类&#xff0c;并重写它的wheelE…

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

python3+pytest+allure自动化框架搭建

博主之前的工作中使用过Pythonrobotframework框架进行接口自动化和webUI自动化&#xff0c;现在按照自己的过往经验&#xff0c;搭建pythonpytestallure的接口自动化框架。 很多人会python、requests、json等库去发送请求并处理请求&#xff0c;但是有些人还是不知道接口自动化…

【网络协议】基于UDP的可靠协议:KCP

TCP是为流量设计的&#xff08;每秒内可以传输多少KB的数据&#xff09;&#xff0c;讲究的是充分利用带宽。而 KCP是为流速设计的&#xff08;单个数据包从一端发送到一端需要多少时间&#xff09;&#xff0c;以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信…

Python基于深度学习的多模态人脸情绪识别研究与实现

一、系统架构设计 A[数据采集] --> B[预处理模块] B --> C[特征提取] C --> D[多模态融合] D --> E[情绪分类] E --> F[系统部署] F --> G[用户界面] 二、数据准备与处理 1. 数据收集 - 视频数据&#xff1a;FER2013&#xff08;静态图像&#xff0…

【虚幻C++笔记】打印输出的方式

目录 UE_LOGGEngine->AddOnScreenDebugMessage UE_LOG UE_LOG 宏是UnrealEngine 中用于日志记录的标准方式。它可以输出日志信息到控制台和日志文件&#xff0c;支持多种日志级别&#xff08;如Log&#xff0c;Warning&#xff0c;Error") UE_LOG(LogCategory, LogVer…