首页 > 其他分享 >【HarmonyOS NEXT】解决自定义Dialog跳转新页面返回后原Dialog关闭的问题

【HarmonyOS NEXT】解决自定义Dialog跳转新页面返回后原Dialog关闭的问题

时间:2024-03-21 17:01:06浏览次数:31  
标签:自定义 void controller Dialog 跳转 dialogController 页面

关键字:

自定义Dialog、Dialog消失、关闭、NEXT

 

1、问题描述

在开发鸿蒙应用的过程中,遇到了这样一个问题:有两个页面A和B,首先在页面A中有一个按钮,点击这个按钮会在页面A中弹出一个自定义的Dialog,在自定义的Dialog中也有一个按钮,点击这个按钮跳转到页面B,在页面B中按返回键返回到页面A中,此时,会发现页面A中之前弹出的自定义的Dialog消失不见了,实际上我们并没有手动去关闭它,我们希望的效果肯定是这个Dialog不会消失,那这个问题该如何解决呢?

 

2、解决方案

在经过一番思考和测试之后,得到了如下的两种解决方案。

方案1:可以使用Stack容器结合其它组件,使用UI组件模拟Dialog的效果,这里就不提供完整的代码了,简单使用伪代码示例如下:

Stack() {
// 原页面内容
Column(){...}
// 模拟遮罩层
Text('').width('100%').height('100%').opacity(0.16) // 透明度可以自己调节一下
.backgroundColor(0x000000).visibility(this.visible)
// 此处是原Dialog中的内容,使用UI组件模拟Dialog
Column(){...}
}

方案2:在页面的onPageShow()这个生命周期方法中调用open()方法打开自定义的Dialog,这种方案提供一个完整的示例代码,如下所示:

自定义的Dialog,CustomDia:

@CustomDialog
export struct CustomDia {
  controller?: CustomDialogController
  cancel: () => void = () => {
  }
  confirm: () => void = () => {
  }
  jumpPage: () => void = () => {
  }

  build() {
    Column() {
      Text('我是弹窗')
      Button('点我跳转页面')
        .onClick(() => {
          if (this.controller != undefined) {
            this.jumpPage()
          }
        })
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('cancel')
          .onClick(() => {
            if (this.controller != undefined) {
              this.controller.close()
              this.cancel()
            }
          }).backgroundColor(Color.Orange).fontColor(Color.White)
        Button('confirm')
          .onClick(() => {
            if (this.controller != undefined) {
              this.controller.close()
              this.cancel()
            }
          }).backgroundColor(Color.Orange).fontColor(Color.White)
      }.margin({ bottom: 10 })
    }
  }
}

页面A,即弹出Dialog的页面,DialogShowPage:

import { CustomDia } from './CustomDia'
import { router } from '@kit.ArkUI'

@Entry
@Component
struct DialogShowPage {
  @State flag: boolean = false
  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: CustomDia({
      cancel: this.onCancel,
      confirm: this.onConfirm,
      jumpPage: this.jumpPage
    }),
    alignment: DialogAlignment.Center
  })

  onPageShow(): void {
    if (this.dialogController != null && this.flag) {
      this.dialogController.open()
    }
  }

  onPageHide(): void {
    if (this.dialogController != null) {
      this.dialogController.close()
    }
  }

  build() {
    Column() {
      Button('第一个页面').onClick(() => {
        if (this.dialogController != null) {
          this.flag = true
          this.dialogController.open()
        }
      })
    }
    .width('100%')
    .height('100%')
  }

  jumpPage() {
    router.pushUrl({
      url: 'pages/Index'
    })
  }

  onConfirm() {
    console.info('------>onConfirm is clicked')
  }

  onCancel() {
    console.info('------>onCancel is clicked')
  }

  aboutToDisappear(): void {
    this.dialogController = null
  }
}

Index页面的代码就不提供了,不是本文的重点,通过上述代码就实现了自定义Dialog不消失的效果,最后一起来看一下实际效果吧:

8f7b4743b5cfa684a10ef0e13ba7f67e_314x676.gif

OK,今天的内容就这么多,下期再会!

标签:自定义,void,controller,Dialog,跳转,dialogController,页面
From: https://www.cnblogs.com/mayism123/p/18087773

相关文章

  • 实现一个自定义MVC
    在Spring核心思想之AOP:在自定义容器基础上实现AOP功能的容器上实现类似SpringMVC的功能。先分析下SpringMVC功能,在SpringMVC快速搭建初体验中:1、web.xml配置的功能被实现了WebApplicationInitializer的类替代,即不用解析web.xml配置文件直接执行WebApplicationIniti......
  • 若依基本框架内容介绍、多数据源配置、命令、自定义打包脚本
    若依是一个能够帮助我们快速搭建一个管理平台的开发框架官网地址:https://doc.ruoyi.vip/ruoyi/ 一、基本框架内容介绍二、多数据源配置三、命令、自定义打包脚本 一、基本框架内容1.文件结构Common:用的比较多的是utils包中的工具(处理字符串、日期、获取ip、发送请求、......
  • 自定义修饰语
    此功能允许使用示例图像添加自定义修饰符,而不仅仅是使用文本值。在EasyDiffusion安装文件夹中,查找一个modifiers文件夹-如果不存在则创建它。您将在此处复制自定义修改器图像。要保留纵横比,请生成512x512的示例图像。如果图像直接位于其中,modifiers那么它将被添加到“修改......
  • 自定义模型
    什么是StableDiffusion模型?EasyDiffusion使用“models”来创建图像。这些模型使用许多图像和图像描述进行训练。在安装过程中,会下载默认模型,即sd-v1-5模型。还存在其他模型。其中一些模型使用sd-v1-5作为基础,然后在其他图像上进行训练,而其他模型则从头开始训练。根......
  • 4、过滤器的使用及自定义过滤器
    fromflaskimportFlask,render_templatefromdatetimeimportdatetimeapp=Flask(__name__)#定义类用于参数传递classUser:"""对于参数age是后续加上去的,因为前期已经对于类进行过实例化了,所以在增加参数时,最好给上一个默认值.不然之前的写法都要......
  • CAD的ShowDialog与普通ShowDialog的区别
    记录解决的奇奇怪怪的bug今天在对form设置启动位置的时候一直设置不成功,后面才发生是AcadApp.ShowModalDialog的问题!我们知道CAD的ShowDialog会使新开的窗体在CAD上面所以正常开窗体都是用这个.今天我想把窗体开在我鼠标点的位置StartPosition=FormStartPosition.Ma......
  • c语言(自定义类型——结构体)
    C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增......
  • 自定义类型:结构体
    自定义类型:结构体一、结构体1.结构体的声明2.结构体变量的定义和初始化二、结构成员访问操作符1.结构体成员的直接访问2.结构体成员的间接访问三、结构的特殊声明四、结构的自引用四、结构体内存对齐1.对齐规律2.为什么存在对齐函数?2.1平台原因(移植原因)2.2性能原因2.3......
  • Salesforce LWC学习(四十九) RefreshView API实现标准页面更新,自定义组件自动捕捉更新
    本篇参考: https://developer.salesforce.com/docs/platform/lwc/guide/data-refreshview.htmlhttps://developer.salesforce.com/docs/platform/lwc/guide/reference-lightning-refreshview.htmlhttps://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KX6dA......
  • 前端学习-vue视频学习011-自定义hooks
    尚硅谷视频链接axios了解了一下axios的语法importaxiosfrom'axios'exportdefaultfunction(){letdogList=reactive(['https://images.dog.ceo/breeds/pembroke/n02113023_4972.jpg'])asyncfunctiongetDog......