如何实现隐私协议自定义弹窗,并在进入新页面时弹窗不消失?

自定义弹窗点击按钮或内容链接进入新页面,弹窗会自动消失。有办法可以避免进入新页面自定义弹窗自动消失吗?

HarmonyOS
2024-06-03 22:06:23
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
mafast

1. 通过指南自定义弹窗,我们可以知道,开发自定义弹窗主要需要注意一下几点:1)使用@CustomDialog装饰器装饰自定义弹窗,此装饰器内进行自定义内容(也就是弹框内容)2)创建构造器CustomDialogController,与装饰器呼应相连3)组件绑定的onClick中,执行弹窗构造器的open方法使弹窗弹出

2. 实现自定义弹窗1中在弹出一个自定义弹窗2,那么需要按照以上步骤自定义两个Dialog,并创建两个相应的CustomDialogController与之呼应相连,且需要注意两点1)在自定义弹窗1中需要再传入自定义弹窗2的CustomDialogController,用于打开自定义弹窗22)在自定义弹窗1中,将指向自己的CustomDialogController放在最后,否则会引起崩溃

3. 最后需要注意的是,需要在aboutToDisappear()中,将所有CustomDialogController对象删除和置空,否则可能造成内存泄露。

示例代码:

// 自定义弹窗组件1 
@CustomDialog 
struct MyDialog1 { 
  controller2: CustomDialogController 
  // 指向自己的CustomDialogController放在最后,否则会引起崩溃 
  controller1: CustomDialogController 
  title: string 
 
  build() { 
    Row() { 
      Column({ space: 10 }) { 
        Text(this.title) 
          .fontSize(25) 
          .fontColor(Color.Blue) 
        Button('点击打开弹窗2') 
          .onClick(() => { 
            this.controller2.open() 
          }).backgroundColor(0xffffff).fontColor(Color.Red) 
        Flex({ justifyContent: FlexAlign.SpaceAround }) { 
          Button('confirm') 
            .onClick(() => { 
              this.controller1.close() 
            }).backgroundColor(0xffffff).fontColor(Color.Black) 
        }.width("100%") 
      }.width("50%") 
    }.height("30%") 
  } 
}
// 自定义弹窗组件2 
@CustomDialog 
struct MyDialog2 { 
  controller: CustomDialogController 
  title: string 
  confirm: (data: string) => void 
  data: string = '' 
 
  build() { 
    Row() { 
      Column({ space: 10 }) { 
        Text(this.title) 
          .fontSize(25).fontColor(Color.Blue).margin(20) 
        Text('假设这是一个隐私说明^-^\n假设这是一个隐私说明^-^\n假设这是一个隐私说明^-^\n') 
          .width('90%') 
          .fontSize(20) 
          .fontColor(Color.Gray) 
          .textAlign(TextAlign.Start) 
        TextInput({ placeholder: "传值测试,请输入内容", text: this.data }) 
          .onChange((data) => { 
            this.data = data // 获取输入框数据 
          }).margin({top:10}).fontSize(20) 
        Flex({ justifyContent: FlexAlign.SpaceAround }) { 
          Button('cancel') 
            .onClick(() => { 
              this.controller.close() 
            }).backgroundColor(0xffffff).fontColor(Color.Black) 
          Button('confirm') 
            .onClick(() => { 
              this.confirm(this.data) // 将输入框数据通过回调函数传给主页面 
              this.controller.close() 
            }).backgroundColor(0xffffff).fontColor(Color.Red) 
        }.width("100%") 
      }.margin({ bottom: 10 }) 
    }.height("50%") 
  } 
}
// main页面 
@Entry 
@Component 
struct Index { 
  @State dialogData: string = '' 
  dialogController2: CustomDialogController = new CustomDialogController({ 
    builder: MyDialog2({ 
      title: '弹窗2', 
      data: this.dialogData, 
      confirm: this.confirm.bind(this), // 绑定自定义的回调函数 
    }), 
    customStyle: false, 
    autoCancel: false 
  }) 
  dialogController1: CustomDialogController = new CustomDialogController({ 
    builder: MyDialog1({ 
      controller2: this.dialogController2, 
      title: '弹窗1', 
    }), 
    customStyle: false 
  }) 
 
  confirm(data: string) { 
    this.dialogData = data 
    console.info(`recv dialog data: ${data}`) // 获取弹窗输入的信息 
  } 
 
  // 在自定义组件即将析构销毁时将dialogController删除和置空,否则可能导致内存泄露 
  aboutToDisappear() { 
    // 删除dialogController 
    delete this.dialogController2 
    delete this.dialogController1 
    // 将dialogController置空 
    this.dialogController2 = undefined 
    this.dialogController1 = undefined 
  } 
 
  build() { 
    Row() { 
      Column({ space: 10 }) { 
        Text(`这是一个弹窗嵌套的测试`) 
          .fontSize(25).margin(20).fontColor(0x3399FF) 
        Button('点击打开弹窗1') 
          .onClick(() => { 
            this.dialogController1.open() 
          }) 
        Text(`接受弹窗2的数据:`) 
          .fontSize(20) 
        TextInput({ placeholder: "输入内容", text: this.dialogData }) 
          .onChange((data) => { 
            this.dialogData = data // 获取输入框数据 
          }).margin(10) 
      }.width("100%").borderWidth(2) 
    }.height("100%").backgroundColor(0xffffee) 
  } 
}
分享
微博
QQ
微信
回复
2024-06-04 21:35:25
相关问题
弹窗跳转到页面后返回弹窗不消失
1734浏览 • 1回复 待解决
使用自定义弹窗实现分享弹窗
587浏览 • 1回复 待解决
如何自定义弹窗中再次弹窗
2313浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗实现
22浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1165浏览 • 1回复 待解决
如何设置自定义弹窗位置
2090浏览 • 1回复 待解决
自定义弹窗如何嵌套使用
1716浏览 • 1回复 待解决