HarmonyOS 路由跳转时自定义弹窗遮挡页面

1、App 使用 Navigation 组件进行导航;

2、pageRoot(@Entry)push 到 pageA(@Component);

3、在 pageA 中弹出了 一个 CustomDialog dialogA;

4、dialogA 中有一个按钮,点击这个按钮会 push 到 pageC;

现在的问题:

当 pageC 显示出来时,dialogA还在最上层显示,遮挡了 pageC;

想要的效果:

1、dialogA 中有一个按钮,点击这个按钮会 push 到 pageC后,pageC 在最上层,dialogA 不可见;

2、当点击pageC导航栏的返回按钮,回到 pageA,这时 dialogA 还显示;

也就是达到 dialogA 的“父组件”是 pageA 的效果,当 pageA 显示时,dialogA 显示在 pageA 的上层;当 pageC 显示时,pageC 在 pageA 的上层,遮住了 pageA,同时也要把 dialogA 遮住。

HarmonyOS
2024-09-26 11:35:20
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
zbw_apple

使用NavDestination的Dialog模式实现自定义弹窗,可以参考如下demo:

interface RouterParams {  
  name?: string,  
  onPop?: (data: PopInfo) => void  
}  
  
// 封装路由工具类,并注册自定义弹窗组件  
class AppRouter {  
  private static instance = new AppRouter();  
  private pathStack: NavPathStack = new NavPathStack();  
  
  public static getInstance(): AppRouter {  
    return AppRouter.instance;  
  }  
  
  public getPathStack(): NavPathStack {  
    return this.pathStack;  
  }  
  
  private pushPath(name: string): void {  
    this.pathStack.pushPath({ name: name })  
  }  
  
  public static push(name: string): void {  
    AppRouter.instance.pushPath(name);  
  }  
  
  public static openDialog(name: string, params?: RouterParams): void {  
    AppRouter.instance.pathStack.pushPath({  
      name: name, param: params, onPop: (data: PopInfo) => {  
        if (params?.onPop) {  
          params.onPop!(data);  
        }  
      }  
    });  
  }  
  
  public static pop(): void {  
    AppRouter.instance.pathStack.pop();  
  }  
}  
@Component  
  // NavDestinationMode.DIALOG  
struct DefaultDialog {  
  build() {  
    NavDestination() {  
      Stack({ alignContent: Alignment.Center }) {  
        Column() {  
        }  
        .width("100%")  
        .height("100%")  
        .backgroundColor('rgba(0,0,0,0.5)')  
        .transition(  
          TransitionEffect.OPACITY.animation({  
            duration: 300,  
            curve: Curve.Friction  
          })  
        )  
        .onClick(() => {  
          AppRouter.pop();  
        })  
  
        Column() {  
          Text("dialogA")  
            .fontColor(Color.White)  
          Button("push pageC", { stateEffect: true, type: ButtonType.Capsule })  
            .onClick(() => {  
              AppRouter.push("pageC")  
            })  
        }  
        .width("50%")  
        .height("30%")  
        .backgroundColor('#ffae2d2d')  
        .transition(  
          TransitionEffect.scale({ x: 0, y: 0 }).animation({  
            duration: 300,  
            curve: Curve.Friction  
          })  
        )  
      }  
      .width("100%")  
      .height("100%")  
    }  
    .mode(NavDestinationMode.DIALOG)  
    .hideTitleBar(true)  
  }  
}  
  
@Component  
struct PageA {  
  @Consume('pageInfos') pageInfos: NavPathStack;  
  
  build() {  
    NavDestination() {  
      Button('push dialogA', { stateEffect: true, type: ButtonType.Capsule })  
        .onClick(() => {  
          AppRouter.openDialog("DefaultDialog");  
        }).margin(10)  
    }.title('PageA')}  
}  
  
@Component  
struct PageC {  
  @Consume('pageInfos') pageInfos: NavPathStack;  
  
  build() {  
    NavDestination() {  
      Column() {  
        Text('pageC')  
          .margin(10)  
        Button('返回', { stateEffect: true, type: ButtonType.Capsule })  
          .onClick(() => {  
            AppRouter.pop();  
          }).margin(10)  
      }  
    }.mode(NavDestinationMode.STANDARD)  
  }  
}  
@Entry  
@Component  
struct pageRoot01 {  
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack()  
  // 显隐控制设置为不占用  
  @State visible: Visibility = Visibility.None  
  @Builder  
  PagesMap(name: string) {  
    if (name == 'pageA') {  
      PageA()  
    } else if (name == 'pageC') {  
      PageC()  
    } else if (name == 'DefaultDialog') {  
      DefaultDialog()  
    }  
  }  
  
  build() {  
    // 在根页面中注册NavPathStack  
    Navigation(AppRouter.getInstance().getPathStack()) {  
      Stack({ alignContent: Alignment.Center }) {  
        Column() {  
          Button('push PageA', { stateEffect: true, type: ButtonType.Capsule })  
            .onClick(() => {  
              AppRouter.push('pageA')  
            })  
        }  
      }  
      .height("100%")  
      .width("100%")  
    }  
    .hideTitleBar(true)  
    .navDestination(this.PagesMap)  
  }  
}  
  
// 封装路由工具类,并注册自定义弹窗组件  
class AppRouter {  
  private static instance = new AppRouter();  
  private pathStack: NavPathStack = new NavPathStack();  
  
  public static getInstance(): AppRouter {  
    return AppRouter.instance;  
  }  
  
  public getPathStack(): NavPathStack {  
    return this.pathStack;  
  }  
  
  private pushPath(name: string): void {  
    this.pathStack.pushPath({ name: name })  
  }  
  
  public static push(name: string): void {  
    AppRouter.instance.pushPath(name);  
  }  
  
  public static openDialog(name: string, params?: RouterParams): void {  
    AppRouter.instance.pathStack.pushPath({  
      name: name, param: params, onPop: (data: PopInfo) => {  
        if (params?.onPop) {  
          params.onPop!(data);  
        }  
      }  
    });  
  }  
  
  public static pop(): void {  
    AppRouter.instance.pathStack.pop();  
  }  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
分享
微博
QQ
微信
回复1
2024-09-26 17:44:04
相关问题
HarmonyOS 页面自定义弹窗遮挡
633浏览 • 1回复 待解决
HarmonyOS 自定义弹窗点击跳转问题
816浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1988浏览 • 1回复 待解决
HarmonyOS 自定义弹窗选择
1339浏览 • 1回复 待解决
HarmonyOS 自定义弹窗CustomDialog
795浏览 • 1回复 待解决