背景
随着应用软件功能的不断增加,应用程序软件首页成为弹窗的重灾区,不仅有升级弹窗,还有积分弹窗,签到,引导等各种弹窗。为了彻底解弹窗问题,本文将使用设计模式解决这个痛点。
设计模式
本方案采用责任链设计模式和建造者设计模式,通过将不同的弹窗添加到弹窗处理类,然后按显示顺序。
实现方案
export interface DialogIntercept{
intercept(dialogChain:DialogChain):void
show():boolean |Promise< boolean >
}
- 提供一个弹窗处理类DialogChain,用于处理多个弹窗的执行逻辑,将弹窗依次添加到 chainList 中保存,然后执行proceed()方法开始显示弹窗,同时提供一个proceedNext() 方法用于直接跳过当前弹窗,由于代码较多,此处省略了部分代码。
/**
* 处理弹窗执行
*/
export class DialogChain {
private index: number = 0
private chainList: ArrayList< DialogIntercept > = new ArrayList()
addIntercept(dialogIntercept: DialogIntercept): DialogChain {
if (!this.chainList.has(dialogIntercept)) {
this.chainList.add(dialogIntercept)
}
return this
}
/**
* 不执行当前弹窗,可以直接跳过
*/
proceedNext() {
++this.index
this.proceed()
}
/**
* 调用继续执行下一步
*/
proceed() {
if (this.index >= 0 && this.index < this.chainList.length) {
let dialogIntercept = this.chainList[this.index]
let show = dialogIntercept.show()
if (typeof show === 'boolean' && show) { {
..........
} else if (show instanceof Promise) {
...........
} else {
........
}
} else {
this.index = 0
}
}
}
- 自定义弹窗实现DialogIntercept 接口,通过show()方法的返回值决定当前弹窗是否弹出,如签到弹窗肯定是每天弹出,可以根据条件 直接返还 true。或者是礼物弹窗,当接口查询到还有是否有未领取的礼物来决定弹窗的是否弹出。这里简单测试一下。
- 分别定义弹窗 DialogA,DialogB,DialogC,实现接口DialogIntercept。
export class DialogA implements DialogIntercept {
uiContext: UIContext
contentNode?: ComponentContent< DialogParams >
promptAction?: PromptAction
constructor(uiContext: UIContext) {
this.uiContext = uiContext;
this.promptAction = this.uiContext.getPromptAction();
}
intercept(dialogChain: DialogChain): void {
let params = new DialogParams()
params.callBack = () = > {
this.promptAction?.closeCustomDialog(this.contentNode)
dialogChain.proceed()
}
// UI展示的Node
this.contentNode = new ComponentContent(this.uiContext, wrapBuilder(DialogABuild), params);
// 打开弹窗
this.promptAction?.openCustomDialog(
this.contentNode,
{
isModal: true,
autoCancel: true,
alignment: DialogAlignment.Center
}
)
}
show(): boolean | Promise< boolean > {
return true
}
}
@Builder
function DialogABuild(params: DialogParams) {
// 封装后的UI
DialogView({ eventModel: params,content:"恭喜您,获得300万积分,请及时领取!",confirmBtnContent:"领取",cancelBtnContent:"取消" })
}
export class DialogParams {
callBack = () = > {
}
}
- 将三个弹窗添加到弹窗管理类,然后依次执行弹窗。
private dialogChain = new DialogChain()
this.dialogChain
.addIntercept(new DialogA(this.getUIContext()))
.addIntercept(new DialogB(this.getUIContext()))
.addIntercept(new DialogC(this.getUIContext()))
//开始执行弹窗
this.dialogChain.proceed()
- 实现效果如下:

审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
HarmonyOS
+关注
关注
80文章
2146浏览量
35574
发布评论请先 登录
相关推荐
热点推荐
QCon·上海站HarmonyOS开发者技术分论坛:共探鸿蒙开发新机遇
论坛(以下简称“论坛”)成功举办,论坛聚焦 AI 实践落地与技术赋能,邀请多位华为技术专家深度解读并分享 HarmonyOS AI辅助开发能力、多设备适配解决方案、场景化赋能、性能调优、场景能力共建以及React Native性
HarmonyOSAI编程编译报错智能分析
图标查看解决方案。
CodeGenie分析后,点击编辑区 Shift+Ctrl+Y ,接受AI提供的修复方案;点击Shift+Ctrl+N拒绝。或右侧对话窗口中Accept All/Reject All按钮,快速接受/拒绝所有修改。
本文主要从参考引用自
发表于 08-25 17:40
分享---超声波焊接机设备实现告 \"警弹窗\" 效果的简单方法
在实际设计产品UI界面中,经常碰到要设计”告警弹窗”功能如,设备运行中产生了告警信息时,要弹出窗口提示用户做操作。
使用拓普微厂家的串口屏开发工具SGTools,可以很容易的实现”告警弹窗”功能,只需要简单设置属性就可以实现;
发表于 08-21 11:17
鸿蒙非侵入式弹窗新解法,企查查正式开源“QuickDialog”弹窗组件库
近日,企查查将其自研的鸿蒙弹窗组件库“QuickDialog”开源,并上线至 OpenHarmony 三方库中心仓。这是鸿蒙生态首个支持“弹窗堆栈暂存能力”的非侵入式弹窗解决方案,凭借
HarmonyOS AI辅助编程工具(CodeGenie)报错分析
解决方案。
3.CodeGenie分析后,点击编辑区Shift+Ctrl+Y,接受AI提供的修复方案;点击Shift+Ctrl+N拒绝。或右侧对话窗口中Accept All/Reject All按钮,快速接受/拒绝所有修改。
以上材料主要参考引用
发表于 07-11 17:48
《仿盒马》app开发技术分享-- 分类模块顶部导航列表弹窗(16)
技术栈
Appgallery connect
开发准备
上一节我们实现了分类页面的顶部导航栏列表,并且实现了首页金刚区跟首页导航栏的联动,这一节我们实现导航栏列表的弹窗功能,需要学习的知识点有自定义
发表于 06-30 10:34
鸿蒙5开发宝藏案例分享---体验流畅的首页信息流
?** 鸿蒙新闻类首页开发全攻略:流畅动效+懒加载实战**
Hey 各位鸿蒙开发者! 今天要分享一个超实用的鸿蒙新闻类首页开发方案,官方文档里藏着的宝藏案例被我挖出来了!从流畅的Tab
发表于 06-12 11:42
HarmonyOS5云服务技术分享--账号登录文章整理
嘿,各位开发者朋友!今天咱们来聊一聊鸿蒙生态中备受关注的ArkTS(API 12),尤其是如何用它快速实现华为账号登录功能。不管你是刚接触HarmonyOS的新手,还是想升级现有项目的技术咖
发表于 05-22 16:16
如何在KaihongOS操作系统上写一个弹窗组件
(),}) }
点击与onClick事件绑定的组件使弹窗弹出。
@Entry@Componentstruct CustomDialogUser {dialogController
发表于 04-30 06:44
DialogHub上线OpenHarmony开源社区,高效开发鸿蒙应用弹窗
。
“DialogHub”的推出为开发者提供了一个开箱即用的弹窗管理解决方案,帮助开发者更高效地实现各种场景下的弹窗功能,显著降低学习成本与开发成本。目前,“DialogHub”已开源至
发表于 04-03 17:30
软通动力亮相华为HarmonyOS Connect伙伴峰会
近日,以“一起创造无限可能,同风起,耀星河”为主题的HarmonyOS Connect伙伴峰会在上海召开。作为首批HarmonyOS Connect生态解决方案商,软通动力受邀出席峰会,与华为签署
鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用
随着HarmonyOS NEXT的正式推出,鸿蒙原生应用开发热度高涨,数量激增。但在三方应用鸿蒙化进程中,性能问题频出。为此,HarmonyOS NEXT推出了一整套原生页面高性能解决方案,包括
发表于 01-02 18:00
HarmonyOS开发指导类文档更新速递(上)
、媒体相关能力新增、优化文档,方便开发者更加高效使用文档。 ArkUI(方舟UI框架) ArkUI(方舟UI框架)是一个简洁、高性能、支持跨设备的UI框架,提供了丰富的应用界面开发所需能力。 · 新增使用弹窗: 介绍各类弹窗的使用场景与实现方法,重点说明自定义
ShiMeta鸿蒙多屏同步拼接解决方案
►►►方案概述鸿蒙多屏同步解决方案在ShiMeta鸿蒙数字标牌系统的基础上,通过信号处理器,实现多个显示屏幕之间的内容同步显示,以提升信息传达的效率和视觉体验。鸿蒙多屏拼接

HarmonyOS实战:首页多弹窗顺序弹出终极解决方案
评论