在HarmonyOS鸿蒙Next中onBackPress实现退出拦截时不生效
在HarmonyOS鸿蒙Next中onBackPress实现退出拦截时不生效
现象描述
在快应用中弹出一个弹窗,期望效果是该弹窗在用户确认后再退出,但是使用onbackpress
控制确认弹窗后自动退出不生效。
问题分析
快应用引擎实现机制决定了onbackpress
不能有耗时的操作。当超过一段时间后,如果代码还没有处理完,就会按返回值为false
处理,即默认关闭该页面。问题代码中通过$watch
监听showResult
的变化,若变化则执行fetch
操作,而这些操作可能还没执行完,从而导致弹窗自动关闭。
问题代码如下:
onBackPress() {
console.log("main onBackPress. status =" + this.showResult);
if (this.showResult) {
this.$element('textarea').focus({ focus: false });
this.content = '';
this.touchedIndex = -1;
//解决因监听showResult变化后的事件处理过缓问题,导致系统返回键有时失效
this.showResult = false;
return true;
}
return false;
},
initDataWatchConfig() {
let that = this;
this.$watch('showResult', (newV, oldv) => {
if (!that.showResult) {
audio.stop();
this.getphoto()//此处是一个比较耗时的操作,以fetch举例,只有清除数据后第一次打开可以复现
}
});
},
getphoto: function () {
var that = this
fetch.fetch({
url: '',
success: function (ret) {},
fail: function (msg, code) {}
})
}
解决方法
给耗时比较长的操作增加延时。为this.showResult = false
增加一个延时,优化后的代码如下:
onBackPress() {
console.log("main onBackPress. status =" + this.showResult);
if (this.showResult) {
this.$element('textarea').focus({ focus: false });
this.content = '';
this.touchedIndex = -1;
//增加延时,解决因监听showResult变化后的事件处理过缓问题,导致系统返回键有时失效
setTimeout(() => {
this.showResult=false;
}, 800);
return true;
}
return false;
}
更多关于在HarmonyOS鸿蒙Next中onBackPress实现退出拦截时不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于在HarmonyOS鸿蒙Next中onBackPress实现退出拦截时不生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS中,onBackPress
方法用于拦截返回键操作。如果该方法不生效,可能是因为未正确重写或未返回true
。请确保以下步骤:
- 重写方法:在Ability或Page中重写
onBackPress
方法。 - 返回
true
:在方法中返回true
以拦截返回键操作。 - 生命周期检查:确保方法在正确的生命周期阶段被调用。
示例代码:
@Override
public boolean onBackPress() {
// 自定义逻辑
return true; // 拦截返回键
}
如果问题仍存在,检查是否有其他逻辑覆盖了该方法。