uni-app 【已解决】 疑似使用 this.$scope.$getAppWebview().close() 关闭页面的 bug

uni-app 【已解决】 疑似使用 this.$scope.$getAppWebview().close() 关闭页面的 bug

开发环境 版本号 项目创建方式
PC Windows HBuilderX
手机 Android
Android 11
厂商 SONY
机型 Xperia 1 J9110

产品分类:uniapp/App


操作步骤:

  1. 在第一个页面导航到第二个页面
    uni.navigateTo({  
        url: '/pages/second'  
    })
    
  2. 在第二个页面导航到第三个页面
    uni.navigateTo({  
        url: '/pages/third'  
    })
    
  3. 在第三个页面上监听 onBackPress()return true 阻止返回,弹窗确认后关闭页面
    export default {  
        name: 'third',  
        onBackPress() {  
            uni.showModal({  
                title: '确定返回?',  
                success(e) {  
                    if (e.confirm) _this.$scope.$getAppWebview().close()  
                }  
            })  
            return true // 阻止返回  
        }  
    }
    
  4. 回到第二个页面后使用同样的步骤
    export default {  
        name: 'second',  
        onBackPress() {  
            uni.showModal({  
                title: '确定返回?',  
                success(e) {  
                    if (e.confirm) _this.$scope.$getAppWebview().close()  
                }  
            })  
            return true // 阻止返回  
         }  
    }
    

更多关于uni-app 【已解决】 疑似使用 this.$scope.$getAppWebview().close() 关闭页面的 bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

刚发现在第二个页面中按返回出现的弹窗居然是第三个页面的弹窗! 肿摸破???

更多关于uni-app 【已解决】 疑似使用 this.$scope.$getAppWebview().close() 关闭页面的 bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html


销毁一个页面并非只关闭 webview 即可,还有很多工作要做。推荐使用封装好的 API:uni.navigateBack。自己增加一个状态来识别是否真的需要后退。

已通过判断 onBackPress({ from }) 中的 from 是否是 backbutton 然后用 uni.navigateBack() 实现了,感谢回复

_this是哪里定义的?

根据你的描述,这是一个典型的页面栈管理问题。this.$scope.$getAppWebview().close() 直接关闭了当前 Webview,但并未正确更新 uni-app 内部的页面栈状态。

问题分析:

  1. 当你在第三个页面调用 close() 时,该 Webview 被销毁,你回到了第二个页面。
  2. 此时 uni-app 的页面栈记录仍然是 [第一页, 第二页, 第三页],但实际显示的已经是第二页。
  3. 当你在第二页再次调用 close() 时,销毁的是第二个页面的 Webview。
  4. 由于页面栈状态不一致,应用可能直接退出或出现异常。

解决方案: 使用 uni-app 的标准 API 来管理页面导航:

// 替代 this.$scope.$getAppWebview().close()
uni.navigateBack({
    delta: 1
})

onBackPress 中的完整实现:

export default {
    onBackPress() {
        uni.showModal({
            title: '确定返回?',
            success: (e) => {
                if (e.confirm) {
                    // 使用标准导航API
                    uni.navigateBack({
                        delta: 1
                    })
                }
            }
        })
        return true
    }
}
回到顶部