uni-app uni.onBeaconUpdate后无法解除扫描监听
uni-app uni.onBeaconUpdate后无法解除扫描监听
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | win10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10
HBuilderX类型:正式
HBuilderX版本号:3.2.9
手机系统:Android
手机系统版本号:Android 10
手机厂商:小米
手机机型:M2004J7AC
页面类型:vue
vue版本:vue3
打包方式:云端
示例代码:
<script>
export default {
data() {
return {
count: 0
}
},
onLoad() {
console.log('onLoad')
this.startBeacon()
},
onUnload() {
console.log('onUnload')
uni.stopBeaconDiscovery()
},
methods: {
startBeacon() {
let that = this
uni.startBeaconDiscovery({
success: function(res) {
that.count = 0
uni.onBeaconUpdate(function(res) {
that.count++
console.log('第' + that.count + '次扫描')
if(that.count>5){
uni.stopBeaconDiscovery()
}
})
}
})
}
}
}
</script>
操作步骤:
- 步骤一:进入A页面,执行uni.startBeaconDiscovery后执行uni.onBeaconUpdate创建Beacon扫描监听
- 步骤二:执行uni.stopBeaconDiscovery后退出当前页面
- 步骤三:再次进入A页面,执行uni.startBeaconDiscovery,之前创建的beacon扫描监听会继续执行
预期结果:
- 退出页面时,当前页创建的beacon扫描监听销毁掉
实际结果:
- 再次进入A页面,执行uni.startBeaconDiscovery,之前创建的beacon扫描监听会继续执行

bug描述:
执行uni.startBeaconDiscovery后执行uni.onBeaconUpdate创建Beacon扫描监听,再执行uni.stopBeaconDiscovery后停止监听,重新uni.startBeaconDiscovery后,之前创建的监听依然还在执行
更多关于uni-app uni.onBeaconUpdate后无法解除扫描监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app uni.onBeaconUpdate后无法解除扫描监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html
根据你的代码和描述,这是一个典型的监听器未正确移除的问题。在uni-app中,uni.onBeaconUpdate 注册的监听器是全局的,不会随页面销毁自动移除。
问题分析:
uni.onBeaconUpdate注册的是全局监听,即使调用uni.stopBeaconDiscovery()停止扫描,监听器本身仍然存在。- 当再次进入页面并调用
uni.startBeaconDiscovery()时,之前注册的监听器会继续响应beacon更新事件。
解决方案:
需要在页面卸载时移除监听器。使用 uni.offBeaconUpdate() 方法:
onUnload() {
console.log('onUnload')
uni.stopBeaconDiscovery()
uni.offBeaconUpdate() // 移除所有beacon更新监听
}
或者,如果你需要更精确的控制,可以保存监听函数引用:
export default {
data() {
return {
count: 0,
beaconUpdateCallback: null
}
},
onLoad() {
console.log('onLoad')
this.startBeacon()
},
onUnload() {
console.log('onUnload')
uni.stopBeaconDiscovery()
if (this.beaconUpdateCallback) {
uni.offBeaconUpdate(this.beaconUpdateCallback)
}
},
methods: {
startBeacon() {
let that = this
uni.startBeaconDiscovery({
success: function(res) {
that.count = 0
// 保存回调引用
that.beaconUpdateCallback = function(res) {
that.count++
console.log('第' + that.count + '次扫描')
if(that.count > 5) {
uni.stopBeaconDiscovery()
}
}
uni.onBeaconUpdate(that.beaconUpdateCallback)
}
})
}
}
}

