2***@qq.com
2***@qq.com
  • 发布:2023-11-13 16:54
  • 更新:2023-11-14 14:55
  • 阅读:338

onBackPress函数中调用uni.navigateBack()不生效

分类:uni-app

全面屏手势或者安卓返回键无法触发输入框的失焦事件, uni.navigateBack可以, 这里想先拦截手势再主动执行uni.navigateBack, 但是拦截以后无法返回, 网上常见的问题是uni.navigateBack也会触发onBackPress, 没有判断from然后进入死循环, 我这里已经判断了, 问题是根本就没进去第二次
示例代码里打印的from是backbutton, 是手势返回, 随后打印了1执行uni.navigateBack, 按理应该二次被onBackPress监听, 然后from等于navigateBack返回页面的, 但是没有进入第二次
我测试了常见的先弹弹窗点确认后再返回的需求, 在uni.navigateBack的位置写了uni.showModal代码, success(写了bind(this))的confirm里执行uni.navigateBack, 一样的无法执行
我用华为鸿蒙4的平板和小米14都测试了, 都不行, 感觉是你们哪次更新更出bug来了

onBackPress(e) {  
    console.log(e);  
    if(e.from=='navigateBack'){  
        return false;  
    }  
    console.log('1');  
    uni.navigateBack();  
    return true;  
},
2023-11-13 16:54 负责人:无 分享
已邀请:
爱豆豆

爱豆豆 - 办法总比困难多

1.失焦后要把数据存到sqllite离线数据库里 这个问题你可以在input触发 @input 事件时存储数据(加个防抖)这样就不用监听blur再去保存数据了
2.返回要先弹窗确认 我这样写没发现有问题呢

onBackPress(e) {    
            if(e.from=='navigateBack'){    
                return false;    
            }    
            // 打开弹框  
            uni.showModal({  
                title:"确认退出吗?",  
                content:"确认退出吗",  
                success: (e) => {  
                    if(e.confirm) uni.navigateBack()  
                }  
            })  
            return true;    
        },
  • 2***@qq.com (作者)

    我直接复制你代码, 弹窗点了确认都返回不了...不知道我这边咋回事

    2023-11-15 14:06

  • 2***@qq.com (作者)

    点了确认就只是弹窗关掉了, 然后啥反应也没有

    2023-11-15 14:07

  • 爱豆豆

    回复 2***@qq.com: 你是用的页面不是tabbar页面吧?在success中打印下返回值对不对

    2023-11-15 14:09

  • 2***@qq.com (作者)

    input时间加防抖保存确实可以, 只是怕刚输完就立马返回还是没存上, 那防抖时间就得设置的很短, 那输入的时候大概率还是会多次触发保存方法, 我那是一个由模板生成的字段超级多的表单, 各个模板加起来得有几百个字段, sql建表的时候就没一个字段一个字段加, 把整个表单json.stringify成了一个超长的字符串作为一个字段保存了, 所以频繁保存代价还是有点大的, 不设置防抖或者设置的时间过短, 会出现输入了5个数字也显示了5个数字但是等一下末尾会有一两个数字的自己消失的情况

    2023-11-15 14:18

  • 2***@qq.com (作者)

    回复 爱豆豆: 不是tabbar页面是page.json里的普通页面, 打印也正常{"errMsg":"showModal:ok","confirm":true,"cancel":false}

    2023-11-15 14:22

  • 2***@qq.com (作者)

    而且我每一个项目每一个有输入框的页面都要换成input时间再加上防抖, 那多麻烦...之前一直没注意到这个问题

    2023-11-15 14:28

  • 爱豆豆

    回复 2***@qq.com: 你看下uni.navigateBack的回调 返回的啥 感觉像是机型的问题 我这安卓13可以确认后返回

    输入框的 你可以把防抖保存时间拉长 并且onHide时再保存一次

    2023-11-15 14:48

  • 2***@qq.com (作者)

    回复 爱豆豆: 试了下success, fail, complete都没返任何东西...还试了relaunch,redirectTo,navigateTo之类的方法都不行, plus.runtime.restart可以

    2023-11-15 18:00

  • 2***@qq.com (作者)

    回复 爱豆豆: 鸿蒙不行就说明安卓12不行, 任何我的安卓14手机也不行, 感觉不是系统问题

    2023-11-15 18:01

  • 2***@qq.com (作者)

    回复 爱豆豆: 刚建了个新项目试了一下, 没问题, 那应该就是项目问题了, 我的项目装了uni-simple-router, 难道这个和onBackPress冲突?

    2023-11-15 18:19

  • 爱豆豆

    回复 2***@qq.com: 嗯嗯 那你对比排除一下

    2023-11-15 18:24

  • 2***@qq.com (作者)

    回复 爱豆豆:解决以后发现拦截手势后主动调的navigateBack也无法触发失焦...只能单独处理了, 每个地方都要搞, 好麻烦

    2023-11-16 14:07

2***@qq.com

2***@qq.com (作者)

HBuilderX当前版本3.96, 是最新正式版

爱豆豆

爱豆豆 - 办法总比困难多

我用安卓13.0 试了下确实不行
这个页面返回时 触发input的blur事件 后要做啥操作吗?说下你的需求 我看看有没有其他的解决方法

  • 2***@qq.com (作者)

    失焦后要把数据存到sqllite离线数据库里, 反正挺麻烦的, 就算这个需求通过别的很复杂的方式实现了, 但是最简单的那个返回要先弹窗确认这个需求肯定无法绕过这个逻辑啊, 还是得解决onBackPress的问题才行

    2023-11-13 18:42

要回复问题请先登录注册