0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

尤枫 来源:jf_54996641 作者:jf_54996641 2025-06-09 16:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景

随着应用软件功能的不断增加,应用程序软件首页成为弹窗的重灾区,不仅有升级弹窗,还有积分弹窗,签到,引导等各种弹窗。为了彻底解弹窗问题,本文将使用设计模式解决这个痛点。

设计模式

本方案采用责任链设计模式和建造者设计模式,通过将不同的弹窗添加到弹窗处理类,然后按显示顺序。

实现方案

  1. 先定义基础弹窗接口 DialogIntercept,统一弹窗的行为。intercept() 方法用于执行下一个弹窗。show ()方法用于判断当前弹窗是否显示,这里同时支持异步接口请求返回的判断。
export interface DialogIntercept{
    
  intercept(dialogChain:DialogChain):void

  show():boolean |Promise< boolean >
}
  1. 提供一个弹窗处理类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

    }
  }
}
  1. 自定义弹窗实现DialogIntercept 接口,通过show()方法的返回值决定当前弹窗是否弹出,如签到弹窗肯定是每天弹出,可以根据条件 直接返还 true。或者是礼物弹窗,当接口查询到还有是否有未领取的礼物来决定弹窗的是否弹出。这里简单测试一下。
  2. 分别定义弹窗 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 = () = > {
  }
}
  1. 将三个弹窗添加到弹窗管理类,然后依次执行弹窗。
private dialogChain = new DialogChain()

 this.dialogChain
      .addIntercept(new DialogA(this.getUIContext()))
      .addIntercept(new DialogB(this.getUIContext()))
      .addIntercept(new DialogC(this.getUIContext()))
 //开始执行弹窗
 this.dialogChain.proceed()
  1. 实现效果如下:

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    80

    文章

    2157

    浏览量

    36296
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    菲诺克科技推出沁恒CH9347有线透传芯片应用于移动电源新国标方案

    通信等类型解决方案, 目前Anker、海陆通、奥海已批量 可以无需用TFT屏导致成本较大增加,更无需重新更改外壳模具。 支持iOS、Android、HarmonyOS手机平板和Windows
    发表于 02-10 09:10

    鸿蒙版微信消息弹窗不能进入聊天界面

    用的最新鸿蒙6.0系统,微信版本也是最新的,之前用的HarmonyOS4.0的微信就可以点击消息弹窗,直接进入聊天界面,很方便。现在点击消息弹窗是进入微信主界面,不能进入对应的聊天界面,有大佬知道是微信问题还是系统问题吗?
    发表于 12-11 16:20

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程
    的头像 发表于 11-28 11:32 1716次阅读
    基于迅为RK3588开发板实现高性能机器狗主控<b class='flag-5'>解决方案</b>- AI能力<b class='flag-5'>实战</b>:YOLOv5目标检测例程

    QCon·上海站HarmonyOS开发者技术分论坛:共探鸿蒙开发新机遇

    论坛(以下简称“论坛”)成功举办,论坛聚焦 AI 实践落地与技术赋能,邀请多位华为技术专家深度解读并分享 HarmonyOS AI辅助开发能力、设备适配解决方案、场景化赋能、性能调优、场景能力共建以及React Native性
    的头像 发表于 10-24 15:59 988次阅读
    QCon·上海站<b class='flag-5'>HarmonyOS</b>开发者技术分论坛:共探鸿蒙开发新机遇

    HarmonyOSAI编程编译报错智能分析

    图标查看解决方案。 CodeGenie分析后,点击编辑区 Shift+Ctrl+Y ,接受AI提供的修复方案;点击Shift+Ctrl+N拒绝。或右侧对话窗口中Accept All/Reject All按钮,快速接受/拒绝所有修改。 本文主要从参考引用自
    发表于 08-25 17:40

    分享---超声波焊接机设备实现告 \"警弹窗\" 效果的简单方法

    在实际设计产品UI界面中,经常碰到要设计”告警弹窗”功能如,设备运行中产生了告警信息时,要弹出窗口提示用户做操作。 使用拓普微厂家的串口屏开发工具SGTools,可以很容易的实现”告警弹窗”功能,只需要简单设置属性就可以实现;
    发表于 08-21 11:17

    直流电机EMC整改:从干扰源到解决方案实战指南

    南柯电子|直流电机EMC整改:从干扰源到解决方案实战指南
    的头像 发表于 08-05 11:07 1361次阅读

    鸿蒙非侵入式弹窗新解法,企查查正式开源“QuickDialog”弹窗组件库

    近日,企查查将其自研的鸿蒙弹窗组件库“QuickDialog”开源,并上线至 OpenHarmony 三方库中心仓。这是鸿蒙生态首个支持“弹窗堆栈暂存能力”的非侵入式弹窗解决方案,凭借
    的头像 发表于 07-31 10:40 851次阅读
    鸿蒙非侵入式<b class='flag-5'>弹窗</b>新解法,企查查正式开源“QuickDialog”<b class='flag-5'>弹窗</b>组件库

    HarmonyOS 5】鸿蒙中常见的标题栏布局方案

    HarmonyOS 5】鸿蒙中常见的标题栏布局方案 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、问题背景: 鸿蒙中常见的标题栏:矩形区域,左边
    的头像 发表于 07-11 18:30 1006次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】鸿蒙中常见的标题栏布局<b class='flag-5'>方案</b>

    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

    HarmonyOS座舱:贴片电容ESR对设备协同供电的影响

    本文以东莞市平尚电子科技有限公司(平尚科技)的AEC-Q200车规级贴片电容技术为核心,探讨HarmonyOS智能座舱设备协同供电场景中ESR对系统稳定性的影响。通过低ESR导电聚合物材料、三维
    的头像 发表于 05-27 14:07 799次阅读
    ​<b class='flag-5'>HarmonyOS</b>座舱:贴片电容ESR对<b class='flag-5'>多</b>设备协同供电的影响

    HarmonyOS5云服务技术分享--账号登录文章整理

    嘿,各位开发者朋友!今天咱们来聊一聊鸿蒙生态中备受关注的ArkTS(API 12),尤其是如何用它快速实现华为账号登录功能。不管你是刚接触HarmonyOS的新手,还是想升级现有项目的技术咖
    发表于 05-22 16:16

    如何在KaihongOS操作系统上写一个弹窗组件

    (),}) } 点击与onClick事件绑定的组件使弹窗弹出。 @Entry@Componentstruct CustomDialogUser {dialogController
    发表于 04-30 06:44