在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。请确保以下步骤:

  1. 重写方法:在Ability或Page中重写onBackPress方法。
  2. 返回true:在方法中返回true以拦截返回键操作。
  3. 生命周期检查:确保方法在正确的生命周期阶段被调用。

示例代码:

@Override
public boolean onBackPress() {
    // 自定义逻辑
    return true; // 拦截返回键
}

如果问题仍存在,检查是否有其他逻辑覆盖了该方法。

回到顶部