HarmonyOS 鸿蒙Next ArkTS自定义弹窗如何拦截物理back键返回事件?如何监听弹窗消失事件?

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

HarmonyOS 鸿蒙Next ArkTS自定义弹窗如何拦截物理back键返回事件?如何监听弹窗消失事件? 如题,点击返回键会直接关闭弹窗,并且不会执行page的onBackPress方法,而且也没有提供弹窗消失的监听。

Dev 3.1.1 Release and API9

13 回复
API 12

onWillDismiss属性来个空实现,就可以拦截返回键关闭弹窗

更多关于HarmonyOS 鸿蒙Next ArkTS自定义弹窗如何拦截物理back键返回事件?如何监听弹窗消失事件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


API 12 上已解决:

给CustomDialogControllerOptions对象设置onWillDismiss,依据回调的动作参数的理由来决定是否拦截。但是由业务逻辑决定的什么时候拦截什么时候不拦截的这种情况,就是不很友好了,可以用一个类实现onWillDismiss所需的回调再通过自定义对话框的构造函数传递给自定义对话框,这样能达到在自定义对话框内部决定其拦截逻辑。

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

IndexPage----------

CustomDialogController

import router from '@ohos.router'

const TAG: string = 'IndexPage----------'

@Component
struct Index {
  controller: CustomDialogController = new CustomDialogController({
    builder: ResultDialog({
      onListen: () => {
        console.log("onListen=====")
      }
    })
  })

  build() {

    Column({ space: 20 }) {
      Child()
      Button("弹出对话框")
        .fontSize(16)
        .onClick(() => {
          console.log('onClick ')
          this.controller.open()
        })

      Button("跳转第二页")
        .fontSize(16)
        .onClick(() => {
          router.pushUrl({ url: 'pages/SecondPage' })
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .onKeyEvent((event) => {
      console.log(TAG + event.keyCode)
    })
  }

  onPageShow() {
    console.log(TAG + 'onPageShow')
  }

  onPageHide() {
    console.log(TAG + 'onPageHide')
  }

  aboutToDisappear() {
    console.log(TAG + "aboutToDisappear")
  }
}

Child

@Component
export struct Child {
  onPageShow() {
    console.log(TAG + 'Child================onPageShow')
  }

  onPageHide() {
    console.log(TAG + 'Child===================onPageHide')
  }

  aboutToDisappear() {
    console.log(TAG + "Child==============aboutToDisappear")
  }

  build() {
    Column() {
      Text()
    }
    .backgroundColor(Color.Gray)
    .width(50)
    .height(50)
  }
}

ResultDialog

@CustomDialog
export struct ResultDialog {
  controller: CustomDialogController;
  onListen: () => void

  onPageShow() {
    console.log(TAG + "ResultDialog     onPageShow")

  }

  onPageHide() {
    console.log(TAG + "ResultDialog     onPageHide")

  }

  aboutToDisappear() {
    console.log(TAG + "ResultDialog     aboutToDisappear")
    this.onListen()
  }

  build() {
    Column({ space: 16 }) {
      Button("关闭弹窗")
        .onClick(() => {
          this.controller.close()
        })

      Button("不关闭弹窗,跳转页面")
        .onClick(() => {
          router.pushUrl({ url: 'pages/SecondPage' })
        })

      Button("关闭弹窗,跳转页面")
        .onClick(() => {
          this.controller.close()
          router.pushUrl({ url: 'pages/SecondPage' })
        })
    }.justifyContent(FlexAlign.SpaceEvenly)
    .width('80%')
    .height('30%')
    .onKeyEvent((event) => {

      if ((event.keyCode === 2)) {
        //TODO 处理业务逻辑

      }
    })
  }
}

@entry 标识的页面组件会拦截掉子组件的部分属性和方法,子组件要处理的业务逻辑不能在子组件的共有方法做处理,会拦截的方法包括子组件的

onBackPress()
onPageShow()
onPageHide()  
或者对弹框的build方法下的最外层组件设置onKeyEvent属性

Column(){
子组件
.....

}

.onKeyEvent((event)=>{
  这里判断event.keyCode===2的情况,再做逻辑处理
})

这个问题没有解决,弹框下的物理返回键没法监听也没法阻止弹框关闭

CustomDialogController的cancel属性方法也没法监听到物理返回键的事件,只能监听到默认autoCancel为true情况下点击弹框周边的事件

一定要处理弹框消失后的业务逻辑

可以用@entry标识的当前页面的onPageShow 方法和自定义弹框的aboutToDisappear组合判断来处理,

另外要考虑特殊情况下的UIAbility的模式,一般那不应考虑

等着解决办法 想做个返回键第一次点击弹窗提示再次点击app退出 但是对话框弹出来后再点击返回键是关闭弹窗 退出不了app

而且有好多用自定义弹窗比较方便 但是不能阻止返回键退出也很烦 只能用page写

你好,这个问题解决了吗

等吧,现在面向普通开发者的api9坑不少

我也发现这个问题了

昨天看到4.0(API10)的文档,好像有弹窗消失的监听了,

https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md/h

但还是不知道咋拦截返回事件,

在HarmonyOS鸿蒙系统中,使用ArkTS进行开发时,自定义弹窗拦截物理back键返回事件以及监听弹窗消失事件,可以通过以下方式实现:

拦截物理back键返回事件

在自定义弹窗的组件中,可以通过重写onBackPress方法来拦截物理back键的返回事件。例如:

@Entry
@Component
struct MyPopup {
  @State private isPopupVisible: boolean = true;

  @Builder onBackPress() {
    if (this.isPopupVisible) {
      console.log('Intercepted back press');
      // 可以在这里处理弹窗逻辑,如显示确认退出的对话框等
      // 如果不需要处理,直接返回true表示拦截该事件
      return true;
    }
    return false; // 不拦截,继续传递事件
  }

  // 其他弹窗逻辑...
}

监听弹窗消失事件

对于监听弹窗消失事件,可以通过监听弹窗的显示状态来实现。通常,自定义弹窗会有一个状态变量来控制其显示与隐藏。当这个状态变量发生变化时,可以触发相应的逻辑。例如:

@Entry
@Component
struct MyPopup {
  @State private isPopupVisible: boolean = true;

  @Effect
  private onPopupVisibleChange() {
    if (!this.isPopupVisible) {
      console.log('Popup disappeared');
      // 在这里处理弹窗消失后的逻辑
    }
  }

  // 其他弹窗逻辑,包括改变isPopupVisible状态的方法...
}

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

回到顶部