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

HarmonyOS鸿蒙开发实战(5.0)自定义全局弹窗实践

鸿蒙HarmonyOS开发实战往期文章必看:

HarmonyOS NEXT应用开发性能实践总结

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

全局状态保留能力弹窗一种很常见的能力,能够保持状态,且支持全局控制显隐状态以及自定义布局。使用效果参考评论组件

效果图预览

使用说明

使用案例参考短视频案例

  1. 首先程序入口页对全局弹窗初始化,使用GlobalStateDialogManager.getGlobalStateDialogNodeController().setUIContext(this.getUIContext())。
  2. 在全局入口页设置弹窗位置GlobalStateDialog()。
  3. 在需要使用弹窗的页面引入GlobalStateDialogManager,使用operateGlobalStateDialog函数对弹窗显隐及内容布局进行配置,配置项参考GlobalStateDialogConfig。

实现思路

  1. 使用显隐控制来实现弹窗的状态保留能力,使用NodeContainer来动态操作弹窗的布局以及内容。源码参考GlobalStateDialog.ets。
/*** 全局状态保留能力弹窗组件*/
@Component
export struct GlobalStateDialog {@StorageProp('isShowGlobalStateDialog') isShowGlobalStateDialog: boolean = false;build() {Column() {、、、// 弹窗的布局与内容,使用NodeContainer提前占位NodeContainer(GlobalStateDialogManager.getGlobalStateDialogNodeController())}.visibility(this.isShowGlobalStateDialog ? Visibility.Visible : Visibility.Hidden).backgroundColor($r('app.color.ohos_global_state_dialog_background_color')).height($r('app.string.ohos_global_state_dialog_sixty_percent')).borderRadius({topLeft: $r('app.integer.ohos_global_state_dialog_number_10'),topRight: $r('app.integer.ohos_global_state_dialog_number_10')}).width($r('app.string.ohos_global_state_dialog_hundred_percent'))}
}/*** 全局状态保留能力弹窗控制器,对外提供fillGlobalStateDialog函数来操作弹窗的布局与内容*/
export class GlobalStateDialogNodeController extends NodeController {private uiContext: UIContext | null = null;private rootNode: BuilderNode<[ESObject]> | null = null;private wrapBuilder: WrappedBuilder<[ESObject]> | null = null;private params: ESObject;setUIContext(uiContext: UIContext) {this.uiContext = uiContext;}/*** 填充全局状态保留能力弹窗的布局以及内容* @param wrapBuilder 布局* @param params 内容*/fillGlobalStateDialog(wrapBuilder: WrappedBuilder<[ESObject]>, params: ESObject) {this.wrapBuilder = wrapBuilder;this.params = params;this.refreshNode();}makeNode(uiContext: UIContext): FrameNode | null {if (this.rootNode != null) {// 返回FrameNode节点return this.rootNode.getFrameNode();}// 返回null控制动态组件脱离绑定节点return null;}refreshNode() {if (!this.uiContext) {return;}// 创建节点,需要uiContextthis.rootNode = new BuilderNode(this.uiContext)// 创建组件this.rootNode.build(this.wrapBuilder, this.params)this.rebuild();}
}/*** 全局弹窗配置项*/
interface GlobalStateDialogConfig {isShowGlobalStateDialog?: boolean; // 显隐控制:true显示/false隐藏wrapBuilder?: WrappedBuilder<[ESObject]>; // 布局params?: ESObject; // 内容
}/*** 管理全局弹窗*/
export class GlobalStateDialogManager {private static globalStateDialogController: GlobalStateDialogNodeController = new GlobalStateDialogNodeController();static getGlobalStateDialogNodeController(): GlobalStateDialogNodeController {return GlobalStateDialogManager.globalStateDialogController;}/*** 控制全局弹窗的显隐及内容布局* @param globalStateDialogConfig 配置全局弹窗*/static operateGlobalStateDialog(globalStateDialogConfig: GlobalStateDialogConfig) {if (globalStateDialogConfig.isShowGlobalStateDialog !== undefined) {AppStorage.setOrCreate('isShowGlobalStateDialog', globalStateDialogConfig.isShowGlobalStateDialog);}if (globalStateDialogConfig.wrapBuilder) {GlobalStateDialogManager.globalStateDialogController.fillGlobalStateDialog(globalStateDialogConfig.wrapBuilder, globalStateDialogConfig.params);}}
}
  1. 使用Stack堆叠能力,为全局弹窗占位,且初始化相关数据。源码参考EntryView.ets.ets。
@Entry
@Component
struct EntryView {、、、aboutToAppear(): void {、、、GlobalStateDialogManager.getGlobalStateDialogNodeController().setUIContext(this.getUIContext());、、、}build() {Stack() {、、、// 全局状态保留能力弹窗GlobalStateDialog()}.alignContent(Alignment.BottomEnd).height('100%').backgroundColor($r('app.color.main_background_color'))}
}

高性能知识点

不涉及

工程结构&模块类型

utils                             // har类型
|---component
|   |---GlobalStateDialog.ets     // 全局状态保留能力弹窗

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 汽车总线之---- CAN FD总线
  • nginx upstream转发连接错误情况研究
  • Python | Leetcode Python题解之第429题N叉树的层序遍历
  • Leetcode 每日一题:Diameter of Binary Tree
  • TS React 项目中使用TypeScript
  • 串的存储实现方法(与链表相关)
  • Pybullet 安装过程
  • 面试干货|自动化测试中常见面试题
  • 摆脱困境并在iPhone手机上取回删除照片的所有解决方案
  • 神经网络面试题目
  • Get请求-LocalDateTime的转换问题
  • Python在数据科学与机器学习中的应用
  • 大话Python|基础语法(上)
  • 【监控】【Nginx】使用 Docker 部署 ELK Stack 监控 Nginx
  • Vite + Vue + TypeScript 项目搭建总结
  • 2017-09-12 前端日报
  • egg(89)--egg之redis的发布和订阅
  • SpringCloud集成分布式事务LCN (一)
  • vue中实现单选
  • zookeeper系列(七)实战分布式命名服务
  • 爱情 北京女病人
  • 反思总结然后整装待发
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何解决微信端直接跳WAP端
  • 数据可视化之 Sankey 桑基图的实现
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一个项目push到多个远程Git仓库
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 优秀架构师必须掌握的架构思维
  • 原生js练习题---第五课
  • 责任链模式的两种实现
  • mysql面试题分组并合并列
  • 通过调用文摘列表API获取文摘
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #laravel 通过手动安装依赖PHPExcel#
  • #VERDI# 关于如何查看FSM状态机的方法
  • #window11设置系统变量#
  • #图像处理
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (六)软件测试分工
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十八)Flink CEP 详解
  • (转)LINQ之路
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 8.0 发布到 IIS
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET 的程序集加载上下文
  • .net 流——流的类型体系简单介绍
  • .NET 使用配置文件
  • .NET多线程执行函数