HarmonyOS 针对API12:组件使用场景dialog

一共有两个页面,A页面、B页面 让A页面弹出一个CustomDialog,然后push到B页面,再返回A页面,刷新dialog数据 目前:

1、进入B页面前,会将dialog进行close(如果不close,进入B页面后,dialog依然存在)

2、从B页面返回A页面时,会再次打开dialog(因为有再次打开dialog的操作,对用户不友好)

期望:A进入B前,不需要close掉dialog;B返回A后,不需要再次打开dialog

问题:为什么dialog会比页面高一个等级呢?A页面的dialog理应只属于A?为什么进入B页面后,还存在呢?

HarmonyOS
8h前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

使用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)
  }
}
分享
微博
QQ
微信
回复
6h前
相关问题
Api12 arm模拟器无法启动
331浏览 • 1回复 待解决
HarmonyOS libEGL.so库在 API12 上不见了
447浏览 • 1回复 待解决
HarmonyOS Navigator的使用场景
19浏览 • 1回复 待解决
napi 基本使用场景示例
1534浏览 • 1回复 待解决
HarmonyOS Navigation和router的使用场景
391浏览 • 2回复 待解决
JSVM-API的应用场景有哪些?
413浏览 • 1回复 待解决
关于emitter、eventHub的使用场景
2619浏览 • 1回复 待解决
请问ArkTS中this使用场景是什么?
1989浏览 • 1回复 待解决
ArkGraphics 2D都有哪些使用场景
608浏览 • 1回复 待解决
HAR和HSP的使用场景区分
404浏览 • 1回复 待解决
请问针对下面场景描述如何实现 ?
166浏览 • 1回复 待解决
HarmonyOS onDidBuild的作用和应用场景
15浏览 • 1回复 待解决
有哪些应用场景
3698浏览 • 1回复 待解决
应用启动框架AppStartup应用场景分析
519浏览 • 1回复 待解决
HarmonyOS API调用与Dialog弹框
247浏览 • 0回复 待解决