【最新鸿蒙应用开发】——合理使用自定义弹框

自定义弹窗选型

合理选择不同的系统能力实现弹窗,有利于提升应用开发效率,实现更好的功能需求,因此了解自定义弹窗的选型和差异非常重要。在应用开发中,为了选择出合适的弹窗选型,从使用场景上,需要重点关注以下两点:

  • 弹窗与界面代码解耦

    在开发业务逻辑时,例如遇到一些网络请求失败的场景,需要触发相应的弹窗提醒用户进行操作,由于在任何页面都有可能触发对应的弹窗,此时弹窗不是与某个页面相关联,这个情况下,就需要弹窗与界面的解耦。

  • 弹窗在界面跳转后保留

    在一些权限配置页,用户首次进入应用时会弹出权限配置弹窗,让用户进行操作,此时若点击跳转到隐私详情页面,返回后弹窗需要保留在页面上。

从能力角度,系统提供了四种不同的方式来实现自定义弹窗,分别是CustomDialog、promptAction、UIContext.getPromptAction、Navigation.Dialog,在开发业务时,需要结合每种弹窗的特点来选择弹窗。

  • CustomDialog弹窗,必须在@Component struct内部定义,即在UI层创建控制器,当一个页面需要弹出多个自定义弹窗时,就需要创建对应个数的CustomDialogController,这会造成UI层代码冗余,无法做到弹窗与界面的解耦。

  • promptAction弹窗,为了解决CustomDialog弹窗的问题,支持了UI元素复用机制@Builder,但依赖UI组件。

  • UIContext.getPromptAction弹窗,基于promptAction弹窗演进而来,支持全局自定义弹窗,不依赖UI组件,依赖UIContext,支持在非页面文件中使用,弹窗内容支持动态修改,支持自定义弹窗圆角半径、大小和位置,适合在与页面解耦的全局弹窗、自定义弹窗显示和退出动画等场景下使用。

  • Navigation.Dialog弹窗,基于Navigation路由形式,以Component组件页面存在于路由栈中,以进出栈的方式打开或关闭弹窗,可以实现弹窗与UI界面解耦,默认透明显示,适合在切换页面弹窗不消失场景下使用。

上述四种弹窗的使用区别,可以从是否支持弹窗与界面代码解耦、弹窗在界面跳转后是否保留这两个方面去进行对比,总结如下:

CustomDialogpromptActionUIContext.getPromptActionNavigation.Dialog
弹窗与界面代码解耦不支持不支持支持支持
弹窗在界面跳转后保留

在对解耦要求不高的情况下,可以使用上面CustomDialog、promptAction两个弹窗,本文围绕开发时主要常见的场景和问题,介绍UIContext.getPromptAction、Navigation.Dialog两个弹窗的使用。

用鸿蒙showCustomMsg提示框(标题和内容无法设置样式居中,总结就是一个字:丑!)

static showCustomMsg(title: string, content: string | Resource, confirmBtn?: string, cancelBtn?: string,
  confirm?: () => void, cancel?: () => void): void {
  promptAction.showDialog({
    title: title ?? "提示",
    message: content,
    buttons: [
      {
        text: cancelBtn ?? "取消",
        color: "#000000"
      },
      {
        text: confirmBtn ?? "确认",
        color: "#4169E1"
      }
    ]
  }).then(data => {
    if (data.index == 1) {
      if (confirm) {
        confirm()
      }
    } else {
      if (cancel) {
        cancel()
      }
    }
  })
}

直接使用鸿蒙showCustomMsg弹框在一些场景是可以的,但是局限性比较大,在一些别的场景需要自定义样式,或者就只是简单想让标题和内容居中都是没有提供样式来调整,因此我们可以使用以下弹框来自定义。

一、在原生页面使用自定义弹窗

import Logger from '../common/utils/Logger'
​
@CustomDialog
export struct HMCustomDialog {
  controller: CustomDialogController
  title: string | Resource = ''
  message: string | Resource = ''
  leftText: string | Resource = ''
  rightText: string | Resource = ''
  showLeft: boolean = true
  showRight: boolean = true
  cancel: () => void = () => {
  }
  confirm: () => void = () => {
  }
​
  build() {
    Column() {
      Text(this.title)
        .fontSize(18)
        .fontColor(Color.Black)
        .fontWeight(800)
        .margin({ top: 10 })
​
      Text(this.message)
        .fontSize(16)
        .fontColor($r('app.color.font_333333'))
        .margin({ top: 10, bottom: 10 })
​
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button(this.leftText)
          .onClick(() => {
            this.cancel()
            this.controller.close()
          }).backgroundColor(0xffffff)
          .fontColor(Color.Gray)
          .visibility(this.showLeft ? Visibility.Visible : Visibility.None)
​
        Button(this.rightText)
          .onClick(() => {
            this.confirm()
            Logger.debug('confirm')
            this.controller.close()
          }).backgroundColor(0xffffff)
          .fontColor($r('app.color.font_0086f3'))
          .visibility(this.showRight ? Visibility.Visible : Visibility.None)
      }.margin({ bottom: 4 })
    }
  }
}

在父页面使用

MyDialogController: CustomDialogController = new CustomDialogController({
  builder: HMCustomDialog({
    title: '提示',
    message: '您还没有登录',
    leftText: '取消',
    rightText: '去登录',
    showLeft: true,
    showRight: true,
    cancel: () => {
    },
    confirm: () => {
      //去登录
      WindowUtils.getRouter().pushUrl({ url: 'pages/login/LoginPage' })
    },
  }),
  alignment: DialogAlignment.Center
})
​
 build() {
    Column(){
    Button()
    .onClick(()=>{
      this.MyDialogController.open()
​
    })
    }
 }
​

二、在非原生页面(如方法中)需要弹出自定义弹窗时

import { ComponentContent } from '@kit.ArkUI'
import { BusinessError } from '@kit.BasicServicesKit';
import { WindowUtils } from '../common/constants/WindowUtils';
import Logger from '../common/utils/Logger';
​
let contentNode: ComponentContent<Content> | undefined
​
export interface Contents {
  title: string
  message: string
  confirm?: () => void,
  leftText?: string
  rightText?: string
}
​
export async function H5ShowCustomDialog(content: Contents) {
​
  let uiContext = WindowUtils.mainWindow.getUIContext();
  let promptAction = uiContext.getPromptAction();
  contentNode = new ComponentContent(uiContext, wrapBuilder(customDialogComponent), content);
​
  try {
    promptAction.openCustomDialog(contentNode)
​
  } catch (error) {
    let message = (error as BusinessError).message;
    let code = (error as BusinessError).code;
    Logger.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
  }
}
​
export function H5CloseCustomDialog() {
  let uiContext = WindowUtils.mainWindow.getUIContext();
  let promptAction = uiContext.getPromptAction();
​
  try {
    promptAction.closeCustomDialog(contentNode)
  } catch (error) {
    let message = (error as BusinessError).message;
    let code = (error as BusinessError).code;
    Logger.error(`CloseCustomDialog args error code is ${code}, message is ${message}`);
  } finally {
    contentNode = undefined
  }
}
​
@Builder
function
customDialogComponent(content: Contents) {
  Column() {
    Dialog({
      content: content,
    })
  }
  .width('65%')
  .height(150)
  .borderRadius(15)
  .justifyContent(FlexAlign.Center)
  .backgroundColor(Color.White)
}
​
@Component
export struct Dialog {
  content: Contents = {} as Contents
​
  build() {
    Column() {
      Text(this.content.title)
        .fontSize(18)
        .fontColor(Color.Black)
        .fontWeight(700)
        .margin({ top: 10 })
​
      Text(this.content.message)
        .fontSize(16)
        .fontColor($r('app.color.font_333333'))
        .margin({ top: 10, bottom: 10 })
​
      //适用于非原生页面的两种提示框,传confirm提供确认和取消键,否则只提供确认键
      if (this.content.confirm) {
        Flex({ justifyContent: FlexAlign.SpaceAround }) {
          Button(this.content.leftText ? this.content.leftText : '取消')
            .onClick(() => {
              H5CloseCustomDialog()
​
            }).backgroundColor(0xffffff)
            .fontColor(Color.Gray)
​
          Button(this.content.rightText ? this.content.rightText : '确定')
            .onClick(() => {
              if (this.content.confirm) {
                this.content.confirm()
              }
            }).backgroundColor(0xffffff)
            .fontColor($r('app.color.font_0086f3'))
        }.margin({ bottom: 4 })
      } else {
        Button('确定')
          .onClick(() => {
            H5CloseCustomDialog()
​
          }).backgroundColor(0xffffff)
          .fontColor($r('app.color.font_0086f3'))
      }
    }.justifyContent(FlexAlign.SpaceBetween).width('100%').height('100%')
  }
}

调用封装好的方法即可

第一种样式

let content: Contents = {
  title: '提示',
  message: e,
}
H5ShowCustomDialog(content)

第二种样式

const confirm: () => void = () => {
  Toolkit.cleanAppCache()
  H5CloseCustomDialog()
}
let cache = (bundleStats.cacheSize / 1024 / 1024)
let content: Contents = {
  title: '温馨提示',
  message: `缓存大小:${cache > 1 ? cache.toFixed(2) + 'MB' : (cache * 1024).toFixed() + 'KB'}`,
  rightText:'确认清理',
  confirm: confirm
}
H5ShowCustomDialog(content)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化爬虫Selenium

自动化爬虫Selenium 这篇文章, 我们将要学习自动化爬虫的知识啦。 目录 1.Selenium的基本操作 2.用Selenuim获取数据 3.当当网数据获取 4.实战 一、Selenium的基本操作 首先, 我们在使用Selenium之前, 需要做两件事情。第一件事情, 就是安装第三方库, 第二件事情, 就是…

开源可视化工具对比:JimuReport VS DataEase

在当今数据驱动的时代&#xff0c;高效的数据可视化工具成为企业洞察业务、做出决策的关键利器。那对于企业来讲如何选择BI产品呢&#xff1f; 在开源可视化工具的领域中&#xff0c;JimuReport和DataEase 以其独特的优势脱颖而出&#xff0c;究竟谁更胜一筹呢&#xff1f;让我…

Jenkins的环境部署

day22 回顾 Jenkins 简介 官网Jenkins Jenkins Build great things at any scale The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project. 用来构建一切 其实就是用Java写的一个项目…

Ubuntu22.04配置强化学习环境及运行相关Demo

什么是强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;简称 RL&#xff09;是机器学习中的一个重要分支&#xff0c;属于一种基于试错机制的学习方法。它通过让智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;进行交互&…

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…

丹摩征文活动 | AI创新之路,DAMODEL助你一臂之力GPU

目录 前言—— DAMODEL&#xff08;丹摩智算&#xff09; 算力服务 直观的感受算力提供商的强大​ 平台功能介绍​ 镜像选择 云磁盘创建 总结 前言—— 只需轻点鼠标,开发者便可拥有属于自己的AI计算王国 - 从丰富的GPU实例选择,到高性能的云磁盘,再到预配置的深度学习…

echarts的图例换行并对齐

现状&#xff1a; 期望&#xff1a; 实现方式&#xff1a; 通过对legend的formatter和textStyle组合设置宽度来实现&#xff0c;代码如下 这里会出现一个问题&#xff0c;发现设置了width没有效果&#xff0c;刚开始以为是宽度给的不够&#xff0c;然后发现并不是&#xff0c…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中&#xff0c;我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板&#xff0c;包括模型、逻辑、处理器、路由等&#xff0c;大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

Windows Server 2022 Web1

载入靶机&#xff0c;看到相关描述&#xff1a; 进入虚拟机发现桌面有phpstudy和解题两个软件&#xff1a; 打开解题.exe&#xff0c;发现里面是一些问题&#xff0c;接下来就需要获取相关信息&#xff1a; 1、shell密码 2、IP地址 3、隐藏账户名称 4、挖矿程序的矿池域名 打…

经典的网络安全技术

以我的理解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情&#xff0c;因为邪派黑客…

【TDOA最小二乘解算】两步最小二乘迭代的TDOA解算方法,适用于二维平面、自适应锚点(附MATLAB代码)

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法&#xff0c;利用多个锚点&#xff08;基站&#xff09;和时间差到达&#xff08;TDOA&#xff09;数据来估计未知目标的位置。 文章目录 运行结果代码代码功能概述代码结构和详细说明初始化部分参数和…

VideoCrafter模型部署教程

一、介绍 VideoCrafter是一个功能强大的AI视频编辑和生成工具&#xff0c;它结合了深度学习和机器学习技术&#xff0c;为用户提供了便捷的视频制作和编辑体验。 系统&#xff1a;Ubuntu22.04系统&#xff0c;显卡&#xff1a;4090&#xff0c;显存&#xff1a;24G 二、基础…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

window 中安装 php 环境

window 中安装 php 环境 一、准备二、下载三、安装四、测试 一、准备 安装前需要安装 Apache &#xff0c;可以查看这篇博客。 二、下载 先到这里下载 这里选择版本为“VS16 x64 Thread Safe”&#xff0c;这个版本不要选择线程安全的&#xff0c;我试过&#xff0c;会缺少文…

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中&#xff0c;用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤&#xff1a; 框架初始化页面加载布局渲染 从页面加载到布局渲染中&#xff0c;主要包含了6个环节&#xff1a; 执行页…

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…

【WPF】Prism学习(十)

Prism MVVM 1.BindableBase 1.1. BindableBase的作用&#xff1a; Prism库提供了一个基础类BindableBase&#xff0c;这个类实现了INotifyPropertyChanged接口。这个接口允许ViewModel&#xff08;视图模型&#xff09;通知视图&#xff08;View&#xff09;当属性&#xff0…

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网&#xff08;Ethernet&#xff09;是一种用于计算机网络的技术规范&#xff0c;广泛应用于局域网&#xff08;LAN&#xff09;的构建。它定义了如何在网络设备之间传输数据&#xff0c;并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…