HarmonyOS 鸿蒙Next 自定义的CustomDialog中,跳转另一个Page 问题

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

HarmonyOS 鸿蒙Next 自定义的CustomDialog中,跳转另一个Page 问题 自定义的CustomDialog中,跳转另一个Page时,不会覆盖CustomDialog跳转,而是在当前Page进行跳转,导致跳转到新Page时,上个Page的CustomDialog还存在!

这种情况应该如何解决?

22 回复

可以参考以下实现:

import router from ‘@ohos.router’;

@Entry @Component struct Index { @State textValue: string = ‘Hello World’ @State visible: Visibility = Visibility.None

build() { // 使用stack可以实现假的dialog覆盖原页面上面 Stack() { Row() { // 初始页面 Column() { Text(‘Hello World’) .fontSize(50) .fontWeight(FontWeight.Bold) // 触发dialog的地方 Button(‘click’) .onClick(() => { console.log(“hit me!”) if (this.visible == Visibility.Visible) { this.visible = Visibility.None } else { this.visible = Visibility.Visible } }) .backgroundColor(0x777474) .fontColor(0x000000) } .width(‘100%’) } .height(‘100%’) .backgroundColor(0x885555) //这里开始是构造弹窗效果主要需要修改的地方,首先是加了一个半透明灰色的蒙层效果 Text(’’) .onClick(() => { if (this.visible == Visibility.Visible) { this.visible = Visibility.None } else { this.visible = Visibility.Visible } }) .width(‘100%’) .height(‘100%’) // 透明度可以自己调节一下 .opacity(0.16) .backgroundColor(0x000000) .visibility(this.visible)

  Column() {
    // 这个可以调节对话框效果,栅格布局,xs,sm,md,lg分别为四种规格
    // 下面的breakpoints是用来区别当前属于哪个类型的断点
    // gridRow里的栅格数量为总数,gridCol里的就是偏移和假Dialog所占据的栅格数
    GridRow({
      columns:{xs:1 ,sm: 4, md: 8, lg: 12},
      breakpoints: { value: ["400vp", "600vp", "800vp"],
        reference: BreakpointsReference.WindowSize },
    })
    {
      GridCol({
        span:{xs:1 ,sm: 2, md: 4, lg: 8},
        offset:{xs:0 ,sm: 1, md: 2, lg: 2}
      }){

        // 这里放的就是原Dialog里的column里的东西,稍微改改应该就可以用了
        Column() {
          Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
          TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
            .onChange((value: string) => {
              this.textValue = value
            })
          Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })
          Flex({ justifyContent: FlexAlign.SpaceAround }) {
            Button('cancel')
              .onClick(() => {
                if (this.visible == Visibility.Visible) {
                  this.visible = Visibility.None
                } else {
                  this.visible = Visibility.Visible
                }
              }).backgroundColor(0xffffff).fontColor(Color.Black)
            Button('jump')
              .onClick(() => {
                router.pushUrl({
                  url: 'pages/Second'
                })
              }).backgroundColor(0xffffff).fontColor(Color.Red)
          }.margin({ bottom: 10 })
        }
        .backgroundColor(0xffffff)
        .visibility(this.visible)
        .clip(true)
        .borderRadius(20)
      }
    }
  }.width('95%')//设置弹窗宽度
}

} }

更多关于HarmonyOS 鸿蒙Next 自定义的CustomDialog中,跳转另一个Page 问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢回复,这个方案我们考虑过,但是由于业务上需要一个全局的Dialog,不能在struct中定义,所以这种方式不太能满足业务上的诉求,

可以使用 Navigation 导航组件,NavDestination设置mode为NavDestinationMode.DIALOG弹窗类型,此时整个NavDestination默认透明显示。弹窗类型的NavDestination显示和消失时不会影响下层标准类型的NavDestination的显示和生命周期,两者可以同时显示。

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-navigation-navigation-V5#%E9%A1%B5%E9%9D%A2%E6%98%BE%E7%A4%BA%E7%B1%BB%E5%9E%8B

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

楼主咋样 解决了吗?

使用Navigation解决,全局都要修改,

请教一下,Navigation是怎么处理的,感谢,

首先确认需求是否如下:

1、PageA 弹窗,用户响应后弹窗不关,但要跳转到 PageB;

2、PageB 返回 PageA时要保持弹窗仍在;

如果需求理解正确,则可考虑方法如下(基于ArkTS开发):

1、PageA中添加弹窗打开控制变量,如 needDialog: boolean

2、弹窗在PageA中打开时,设置上面控制变量 needDialog = true;

3、弹窗中用户响应后正常关闭弹窗,但将相关数据传回PageA进行保存;并且不修改 needDialog

4、在弹窗的返回处理回调中进行页面跳转到PageB, 应该是 pushUrl(),此时PageA会被压栈保留,因此会触发 onPageHide()生命周期回调;此处可进行弹窗信息保存,以便后续恢复弹窗用;

5、从PageB返回时PageA恢复显示,会触发生命周期方法onPageShow(),此处可判断 needDialog是否为true,是则主动弹出弹窗,并传递原来数据;

这样就不用强行保留弹窗,从系统资源来讲也更合理。

这样是能实现,但是弹窗使用角度上来看,我还需要控制Page的生命周期方法,使用起来并不方便,而且Page有多个弹窗的情况下,会有多个@State来控制。

我测试的结果是,点击弹框上的按钮 或者 定时器push页面时,弹框会自动消失的。楼主是不想让他消失吗 ?另外请问下 subwindow是怎么使用的?有相关文档吗?

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

自动消失没问题,但是某些业务场景点击弹窗上的按钮跳转后,弹窗不能消失,后续需要继续交互。

subWindow官网有文档呀,搜一下就有了。

subWindow也有弊端,需要自己实现一个创建subWindow的逻辑和处理动画等,比较麻烦,而且多个subWindow同时存在时,router跳转不能默认使用顶部的subWindow,某些业务场景也不满足。

目前在打算使用换成 NavDestination,

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

NavDestination对根容器的侵入性太大,实现了整个APP就必须要Navigation,混合使用Navigation和router会有页面错乱问题,

Navigation和router不能混用
页面错乱的问题我们也遇到了。
现在全切Navigation了,

解决了吗? 请问跳转页面用的是replace?还是push? 我在使用push 的时候会导致dialog 自动关闭。

我们使用subWindow当作弹窗,解决了,

问题描述

求示例代码,subWindow里面上还是有这个问题,

别试啦,使用navigation的方式了,现在我们弃用subWindow了,

图片

可以在点击跳转时通过close关闭弹窗。

参考文档:自定义弹窗

业务场景是不能关闭,返回需要展示上一级弹窗,

在HarmonyOS鸿蒙Next系统中,若你在自定义的CustomDialog中希望跳转到另一个Page,通常可以通过页面路由(Page Router)机制来实现。以下是基本步骤:

  1. 获取AbilitySlice实例:首先,你需要从CustomDialog中获取当前显示的AbilitySlice实例。这通常通过构造函数或设置方法传递进来。

  2. 使用Intent跳转:创建一个Intent对象,设置目标Page的URI或其他必要参数,然后调用AbilitySlice的startAbility方法启动目标Page。

  3. 处理页面跳转逻辑:在CustomDialog的事件处理逻辑中(如按钮点击事件),执行上述Intent跳转代码。

  4. 确保页面路由配置正确:在config.json中确保目标Page的路由信息已正确配置,以便系统能够正确解析Intent并启动目标Page。

示例代码片段(伪代码):

// 假设在CustomDialog类中
public class CustomDialog extends Dialog {
    private AbilitySlice slice;

    public CustomDialog(AbilitySlice slice) {
        this.slice = slice;
    }

    // 在按钮点击事件中
    button.setClickedListener(new Component.ClickedListener() {
        @Override
        public void onClick(Component component) {
            Intent intent = new Intent();
            // 设置目标Page的URI等
            intent.setElement(new UriElement("your.target.page.uri"));
            slice.startAbility(intent);
            dismiss(); // 关闭Dialog
        }
    });
}

注意:上述代码为示意性伪代码,具体实现需根据HarmonyOS SDK的实际API进行调整。

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

回到顶部