HarmonyOS 鸿蒙Next ArkTS自定义弹窗如何拦截物理back键返回事件?如何监听弹窗消失事件?
HarmonyOS 鸿蒙Next ArkTS自定义弹窗如何拦截物理back键返回事件?如何监听弹窗消失事件? 如题,点击返回键会直接关闭弹窗,并且不会执行page的onBackPress方法,而且也没有提供弹窗消失的监听。
Dev 3.1.1 Release and API9
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)的文档,好像有弹窗消失的监听了,
但还是不知道咋拦截返回事件,
在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,