关于HMS-Core:在onBackPress中实现退出拦截时不生效

景象形容

在快利用中弹出一个弹窗,冀望成果是该弹窗在用户确认后再退出,然而应用onbackpress管制确认弹窗后主动退出不失效。

问题剖析

快利用引擎实现机制决定了onbackpress不能有耗时的操作。当超过一段时间后,如果代码还没有解决完,就会按返回值为false解决,即默认敞开该页面。问题代码中通过$watch监听showResult的变动,若变动则执行fetch操作,而这些操作可能还没执行完,从而导致弹窗主动敞开。
问题代码如下:

1.  onBackPress() {
2.    console.log("main onBackPress. status = " + this.showResult);
3.    if (this.showResult) {
4.      this.$element('textarea').focus({ focus: false });
5.      this.content = '';
6.      this.touchedIndex = -1;
7.      //解决因监听showResult变动后的事件处理过缓问题,导致系统返回键有时生效
8.      this.showResult = false;
9.      return true;10.   }
11.   return false;
12. },
13. initDataWatchConfig() {
14.   let that = this;
15.   this.$watch('showResult', (newV, oldv) => {
16.     if (!that.showResult) {
17.       audio.stop();
18.       this.getphoto()//此处是一个比拟耗时的操作,以fetch举例,只有革除数据后第一次关上能够复现
19.     }
20.   });
21. },
22. getphoto: function () {
23.   var that = this
24.   fetch.fetch({
25.     url: ' 
26.     success: function (ret) {
27.     },
28.     fail: function (msg, code) {
29.     }
30.   })}

解决办法

给耗时比拟长的操作减少延时。为this.showResult = false减少一个延时,优化后的代码如下:

1.  onBackPress() {
2.    console.log("main onBackPress. status = " + this.showResult);
3.    if (this.showResult) {
4.      this.$element('textarea').focus({ focus: false });
5.      this.content = '';
6.      this.touchedIndex = -1;
7.      //减少延时,解决因监听showResult变动后的事件处理过缓问题,导致系统返回键有时生效
8.      setTimeout(() => {
9.          this.showResult=false; 
10.     }, 800);
11.     return true;
12.   }
13.   return false;
14. }

原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0204411119222660356?fid=18

原作者:Mayism

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理