HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词:CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常

问题存在API版本:API10 - API12(该问题已反馈,期望后续官方能增加页面级控制能力)

在正常的鸿蒙app开发过程中,时常会加载一些弹窗内容,比如隐私政策弹窗、新手引导弹窗、营销广告弹窗等。那么我们会选择使用 CuntomDialog 或创建 SubWindow 的形式去展示出我们的弹窗,但是目前鸿蒙的弹窗存在 2 个问题

①弹窗无法保持在目标页面的问题:鸿蒙中自定义弹窗或子窗口由于展示优先级高于其他组件,则会出现当弹窗正在展示时跳转进入下一个页面后,弹窗依旧展示在 app 最上层的异常情况,或当折叠屏设备分屏后展示出弹窗,合起折叠屏后,弹窗同样会展示在下一个页面上的异常情况。

②无法控制弹窗展示优先级的问题:如当前存在 2 个弹窗,先展示弹窗 B,后展示弹窗 A,同时要求弹窗 A 展示在弹窗 B 上层,当前的鸿蒙弹窗并不支持这样的操作,仅为谁后来谁在上的原则。

 解决前    解决后

那么我们应该如何解决这 2 种情况?想要解决该问题,那我们就不能再去使用这两种弹窗方式。要想弹窗仅展示在我们的目标页面中,那么我们就应该使用 Stack 层叠布局的形式去改造我们的页面整体结构,从页面左上角 0vp 处摆放一个宽高均为 0vp 的组件当作我们的弹窗展示容器,将所有的弹窗都统一管理在该组件中,用状态变量实现控制显隐弹窗的操作,明确目标那么开始。

本期文章完整demo以上传至Gitee:Harmony 自定义弹窗页面级控制解决方案

1. Stack 布局改造页面结构

将以往弹窗逻辑由图1 调整至图2 ,第 2 步开始将介绍 DialogView 自定义组件的用法。

图1(改造前)

图2(改造后)

2. DialogView 自定义组件的实现

经过第 1 步的改造后,我们已经在页面左上角提前占位了弹窗展示区域,在该 DialogView 自定义组件中,统一管理我们的弹窗组件,这样我们也就可以自行编排布局控制弹窗的展示层级与先后顺序了。

可以使用 Column 组件直接控制弹窗展示顺序(当2个及以上的弹窗同时展示时,其他组件会在屏幕外等待展示,上一个弹窗隐藏后,下一个弹窗展示)
或使用 Stack 组件直接控制弹窗展示层级(当2个及以上的弹窗同时展示时,各弹窗同时展示在页面上,可自行摆放弹窗的上下层级关系)

这里我们就按照两个弹窗都展示在屏幕内的业务,使用 Stack 布局。

3. DialogViewController 控制器的实现

在前2步中已经初步实现了弹窗的页面级与层级的控制,那么如何做到弹窗动态的展示或隐藏操作?

首先我们需要了解,鸿蒙应用开发过程中,要想改变 UI 展示效果,需要配合使用一系列的状态装饰器,使属性成为状态变量,当被状态装饰器装饰的属性发生变化后,在页面UI中使用到该属性的地方,都会触发UI更新,如最直观的就是 @State 装饰器。

就目前场景而言,弹窗与主页面之间已经出现跨组件的情况了,实际开发过程中业务场景会更为复杂,所以我们可以直接使用 class 类配合 @Observed 装饰器实现跨组件之间的数据通讯,只需在父组件创建出目标对象,传递至弹窗组件,并用 @ObjectLink 绑定接收即可,这样做的好处是,不管途中经过多少组件,弹窗组件调用该对象方法,也能改变途中使用到该对象方法的UI,并且能够更好的统一管理所有的弹窗状态(或直接使用单例形式导出,在目标弹窗组件直接使用 @State 装饰器接收该单例对象即可,无需在根页面 new 出控制器对象进行逐级传递)。

如下图所示,DialogViewController 仅为 2 个弹窗展示状态的属性,并进行私有,使用对外提供的各种方法获取或改变二者属性的值。

更多装饰器相关使用请参考官方文档,此处就不过多赘述:harmonyOS文档中心 - 状态管理

4. 弹窗内布局如何编排

我们从步骤 1 开始改造布局到步骤 2 的自定义弹窗组件实现,都并未看到对弹窗进行宽度高度的设置,那我们的弹窗应该如何铺满屏幕?以 PrivacyDialog 为例,我们只需要在需要展示的弹窗上设置对应的宽度及高度即可,当弹窗不展示,则在第 2 步中 DialogView 的宽高为 0,该方式可避免在没有弹窗时的情况下,弹窗组件影响主页面触摸点击事件的影响。

5. 完整demo

本期文章完整demo已提交至Gitee,可回顶部查看。

6. end

此处打个广告介绍下我开发的 markdown 预览解析三方库,@luvi/lv-markdown-in

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws(学习笔记第二课) AWS SDK(node js)

aws(学习笔记第二课) 使用AWS SDK(node js) 学习内容: 使用AWS SDK(node js) 1. AWS SDK(node js) AWS支持多种SDK开发(除了AWS CLI,还支持其他的SDK) AndroidPythonNode.js(Javas…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目! No.1 约数个数 No.2 约数之和 先来看第一道:约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

五种IO模型与阻塞IO

一、前言 在网络中通信的本质其实是网络中的两台主机的进程间进行通信,而进程通信的本质就是IO。 IO分为输入(input)和输出(output)站在进程的角度讲,进程出去数据为输出,外部数据进入进程为输…

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN,并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口,但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…

[ComfyUI]Flux:太强了!任意扩图神器,小红书极致逼真风格出游打卡写实风

随着人工智能技术的不断发展,图像生成与反推技术已经成为了AI领域的一大热点。今天,我们就来为大家详细介绍一款由ComfyUI团队开发的超强图像反推工具——Flux,以及如何使用它实现任意扩图和极致逼真风格出游打卡写实风。 一、Flux&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种,性能如下所示: 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

centos7安装配置nginx

先安装依赖 安装依赖之前最好先执行下update yum update yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y cd /usr/local/nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd /usr/local/ngi…

双非本 985 硕,上岸快手大模型算法岗!

最近已有不少大厂都在秋招宣讲,也有一些已在 Offer 发放阶段了。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行…

高校校园交友系统小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,基础数据管理,论坛管理,公告信息管理,轮播图信息管理 微信端账号功能包括:系统首页,用户&#…

反调试—1

IsDebuggerPresent() CheckRemoteDebuggerPresent() 其内部实际调用NtQueryInformationProcess() bool _stdcall ThreadCall() {while (true){BOOL pbDebuggerPresent FALSE;CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);if (pbDebuggerPres…

fiddler抓包18-2_导出jmeter、postman脚本(带请求头)

课程大纲 1. Fiddler导出请求为curl脚本 选中请求,“文件” - “导出会话” - “选中的会话” - “cURL Script”。 2. 导入jmeter ① 复制curl脚本。 ② 打开jmeter,“工具” - “import from cURL”,粘贴脚本,勾选“Add cooki…

二分查找一>寻找峰值

1.题目&#xff1a; 2.解析&#xff1a; 暴力遍历代码&#xff1a;O(N),由于该题数据很少所以可以通过 暴力遍历&#xff1a;O(N),由于该题数据很少所以可以通过int index 0;for(int i 1; i < nums.length-1; i) {//某段区域内一直递增&#xff0c;更新就indexif(nums[i]…

红黑树学习

红黑树: k v 方式 用在哪里&#xff1a; 1.hash 强查找的过程&#xff1a; 1.rbtree 2.hash 3.b/b tree 4.链表 红黑树&#xff1a; 1.每个结点是红的或者是黑的 2.根结点是黑的 3.每个叶子结点是黑的 4.如果一个结点是红的&#xff0c;则它的两个儿子是黑的 5.对每个节点&…

性能学习5:性能测试的流程

一.需求分析 二.性能测试计划 1&#xff09;测什么&#xff1f; - 项目背景 - 测试目的 - 测试范围 - ... 2&#xff09;谁来测试 - 时间进度与分工 - 交付清单 - ... 3&#xff09;怎么测 - 测试策略 - ... 三.性能测试用例 四.性能测试执行 五.性能分析和调优 六…

ElasticSearch备考 -- Search across cluster

一、题目 配置两个集群&#xff0c;集群名称为my-application-01、my-application-02&#xff0c;导入es自带Sample flight data数据集&#xff0c;配置扩集群检索&#xff0c;查询数据 二、思考 准备工作有两个集群&#xff0c;并需要对集群配置角色中增加 remote_cluster_cl…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

光伏组件模型模板在SketchUp中如何完成成模数化设计?

选中模板组件&#xff0c;点击左侧工具栏中移动工具&#xff0c;按住Ctrl再依次点击组件起始点和终点&#xff0c;完成组件复制&#xff0c;输入需要复制的组件数量&#xff08;*n&#xff09;后回车&#xff0c;即可完成模数化设计。 选中模组的多块模型右键进行创建组件或群…

高考技术——pandas使用

百家讲坛&#xff0c;谈论古今&#xff0c;今天我们不聊别的&#xff0c;我们来聊一聊中国的国宝——大熊猫&#xff08;bushi&#xff09; 好好&#xff0c;言归正传&#xff0c;我们今天来讲pandas import pandas as pd 申明无需多言&#xff0c;高考主要考察Series和Data…

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面&#xff1a; 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的&#xff0c;镜像图层都是只读层&#xff0c; 第二个是&#xff1a; 容器读写层&#xff0c; 容器启动后&#xff0c;docker会基于容器镜像的读层&…

多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。

自己写的多文件 MD5校验工具&#xff0c;一个文件开一个线程&#xff0c;有最大I/O 缓存设置&#xff0c;兼容读写MD5后缀文件。 共计91个文件&#xff0c;合计180G左右 12分钟左右&#xff0c;UI基本卡废&#xff0c;但程序没蹦&#xff0c;属于正常。 卡的原因是基本是用 I/O…