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();  
  }  
}
分享
微博
QQ
微信
回复1
2024-09-26 17:44:04
相关问题
自定义弹窗自定义转场动画
1133浏览 • 1回复 待解决
HarmonyOS 自定义弹窗选择
356浏览 • 1回复 待解决
HarmonyOS 全局自定义弹窗demo
286浏览 • 1回复 待解决
HarmonyOS 自定义弹窗的问题
694浏览 • 1回复 待解决
HarmonyOS 自定义弹窗CustomDialog问题
612浏览 • 1回复 待解决
自定义弹窗中的变量如何传递给页面
2678浏览 • 1回复 待解决
HarmonyOS 自定义弹窗 (CustomDialog)问题
396浏览 • 1回复 待解决
HarmonyOS 自定义弹窗遮罩未全屏
665浏览 • 1回复 待解决
使用自定义弹窗实现分享弹窗
566浏览 • 1回复 待解决
如何在自定义弹窗中再次弹窗
2268浏览 • 1回复 待解决
自定义弹窗使用相关问题
922浏览 • 1回复 待解决
自定义弹窗如何嵌套使用
1676浏览 • 1回复 待解决