HarmonyOS 鸿蒙Next在CustomDialog中打开新的页面时CustomDialog会自动消失

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next在CustomDialog中打开新的页面时CustomDialog会自动消失 问题描述: 在CustomDialog中打开新的页面,CustomDialog会自动消失,如何解决。

代码描述: ActionSheetExample.ets:

import { CustomDialogExample } from '../view/CustomDialogExample'; 
import { UIContext } from '@ohos.arkui.UIContext'; 
import common from '@ohos.app.ability.common'; 
import { DialogManager } from '../view/DialogManager'; 

@Entry 
@Component 
struct ActionSheetExample { 
  @State textValue: string = '' 
  @State inputValue: string = 'click me' 
  @State angle: number = 0 

  dialogController: CustomDialogController | null = new CustomDialogController({ 
    builder: CustomDialogExample(), 
    autoCancel: true, 
    alignment: DialogAlignment.Bottom, 
    openAnimation: { duration: 0 }, 
    closeAnimation: { duration: 0 }, 
    offset: { dx: 0, dy: 0 }, 
    customStyle: true 
  }) 

  constructor() { 
    super() 
  } 

  build() { 
    Column { 
      Text('rotate').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14) 
      Row 
        .rotate({ 
          x: 0, 
          y: 0, 
          z: 1, 
          angle: this.angle 
        }) // 组件以矢量(0,0,1)为旋转轴,绕中心点顺时针旋转300度 
        .width(100) 
        .height(50) 
        .backgroundColor(0xAFEEEE) 
        .onClick(() => { 
          animateTo({ curve: Curve.Ease, onFinish: () => {}, duration: 300 }, () => { 
            this.angle += 180 
          }) 
        }) 

      Button(this.inputValue) 
        .onClick(() => { 
          if (this.dialogController != null) { 
            this.dialogController.open() 
          } 
        }).backgroundColor(0x317aff) 
        .margin(20) 
      Button('打开CallerPage').onClick(() => { 
        let context = getContext(this) as common.UIAbilityContext 
        context.startAbility({ 
          bundleName: "com.example.myapplication", 
          abilityName: "CallerAbility", 
        }).catch((err: Error) => { 
          console.log(err.message) 
        }) 
      }) 
    }.width('100%').margin({ top: 5 }) 
  } 
}

CustomDialogExample.ets:

import common from '@ohos.app.ability.common'; 
import router from '@ohos.router'; 

@CustomDialog 
@Preview 
export struct CustomDialogExample { 
  @State dialogHeight: number = 0 
  controller?: CustomDialogController 
  initOffsetY: number = 0; 
  datas: Array<number> = [1, 2] 
  initHeight: number = 60 * this.datas.length + 90 
  topBorderRadius: number = 20; 
  closeFlag: boolean = false; 
  open = () => { 
    this.moveTo(this.initHeight) 
  } 
  close = () => { 
    this.moveTo(0).then(() => { 
      this.controller?.close() 
    }) 
  } 
  moveTo = (height: number) => { 
    return new Promise<void>((res) => { 
      animateTo({ curve: Curve.Ease, onFinish: res, duration: 300 }, () => { 
        this.dialogHeight = height 
      }) 
    }) 
  } 

  // 阻尼函数 
  damping(x: number, max: number) { 
    let y = Math.abs(x); 
    y = 0.82231 * max / (1 + 4338.47 / Math.pow(y, 1.14791)); 
    return Math.round(x < 0 ? -y : y); 
  } 

  build() { 
    Column { 
      Column { 
        Column { 
          Row { 
            Text('Title') 
          } 
          .width('100%') 
          .height(30) 
          .justifyContent(FlexAlign.Center) 

          Scroll { 
            Column { 
              ForEach(this.datas, () => { 
                Column { 
                  Image($r('app.media.startIcon')) 
                    .width(50) 
                    .height(50) 
                } 
                .onClick(()=>{ 
                  router.pushUrl({ 
                    url:'pages/Index' 
                  }) 
                }) 
                .width('100%') 
                .margin({ top: 10 }) 
                .justifyContent(FlexAlign.Center) 
              }) 
            } 
          } 
        } 
        .layoutWeight(1) 

        Row { 
          Button('取消') 
            .onClick(() => { 
              this.close() 
            }).width('100%').backgroundColor(0xffffff).fontColor(Color.Black) 
        } 
        .backgroundColor(Color.Red) 
        .width('100%') 
        .height(50) 
      } 
      .justifyContent(FlexAlign.SpaceBetween) 
      .height(this.dialogHeight) 
      .width('100%') 
      .backgroundColor(Color.White) 
      .onAppear(this.open) 
      .zIndex(2) 
      .borderRadius({ topLeft: this.topBorderRadius, topRight: this.topBorderRadius }) 

      Column 
        .width('100%') 
        .height('100%') 
        .backgroundColor(0x33000000) 
        .position({ x: 0, y: 0 }) 
        .zIndex(1) 
    } 
    .width('100%') 
    .height('100%') 
    .justifyContent(FlexAlign.End) 
  } 
}

更多关于HarmonyOS 鸿蒙Next在CustomDialog中打开新的页面时CustomDialog会自动消失的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

做成像弹出隐私协议对话框那样效果,可以吗?就是当用户点击隐私协议对话框也就是自定义对话框里的文本,然后打开一个新页面,当从新页面返回时,对话框还是显示的。如果是要这样的效果,可以添加让对话框的显示和隐私一个标识,保存到用户首选项实现数据(https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-preferences-V5)这样通过用户首选项数据库里的标识来控制对话框的显示或隐私,也就是在显示对话框的页面生命周期判断页面显示时,判断是否要显示对话框,页面退出时,关闭对话框。

更多关于HarmonyOS 鸿蒙Next在CustomDialog中打开新的页面时CustomDialog会自动消失的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


API12不会,但是有另外一个问题,跳转页面竟然在弹框之下展示了,不是覆盖弹框上面展示的

这个太搞笑了!目前有解决办法没有!

两种设计都挺离谱的,除了用自定义组件来代替dialog有没有其他解决方法了?

解决措施:

通过使用Stack替代CustomDialog,再控制Stack的显隐即可达到效果。

在HarmonyOS鸿蒙系统中,当在CustomDialog中尝试打开新的页面时,CustomDialog自动消失的问题通常是由于页面跳转逻辑与Dialog的生命周期管理冲突导致的。

在鸿蒙系统中,Dialog是一种模态窗口,用于在当前页面上显示临时信息或获取用户输入。当Dialog显示时,它通常会阻塞用户与背景页面的交互。然而,当在Dialog内部触发页面跳转时,系统可能会认为Dialog的任务已完成,因此自动关闭Dialog。

为了解决这个问题,你可以考虑以下几种方法:

  1. 调整页面跳转逻辑:避免在Dialog内部直接进行页面跳转。可以在Dialog的按钮点击事件中,先关闭Dialog,然后再进行页面跳转。

  2. 使用非模态窗口:如果适用,可以考虑使用非模态窗口(如Popup或Drawer)来替代Dialog,这些窗口类型在显示时不会阻塞背景页面的交互。

  3. 自定义页面跳转动画:如果需要保持Dialog的显示状态同时跳转到新页面,可以尝试通过自定义页面跳转动画和背景透明度等属性来模拟所需的效果,但这通常较为复杂且可能不符合用户体验的最佳实践。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部