react-native0.64.2+expo43.0.0下expo-barcode-scanner仅能扫描一次如何解决
这是expo 43配套的expo-barcode-scanner@11.1.2的已知版本bug,触发原因是你采用条件渲染销毁组件的控制逻辑,第一次扫描完成卸载组件后,内部相机资源没有正确释放,导致第二次挂载组件时无法正常激活扫描能力,可通过以下几种方式解决:
- 方案1(推荐):修改扫描状态控制逻辑,不销毁BarCodeScanner组件,通过控制
onBarCodeScanned属性的赋值实现开关扫描
首先在state中新增scanned字段标记扫描状态,初始值为false:
state = { // 其他原有状态 scanned: false, escaneando: true // 保持为true,不需要通过这个变量销毁组件 }
修改渲染代码:
<BarCodeScanner barCodeTypes={[ BarCodeScanner.Constants.BarCodeType.ean13, BarCodeScanner.Constants.BarCodeType.ean8, BarCodeScanner.Constants.BarCodeType.upc_a, BarCodeScanner.Constants.BarCodeType.upc_e, ]} onBarCodeScanned={this.state.scanned ? undefined : this.handleBarCode.bind(this)} style={[StyleSheet.absoluteFillObject, styles.barscan]} />
修改扫描处理逻辑:
handleBarCode = (scanResult) => { this.setState({ scanned: true }) // 原有处理扫描数据的业务逻辑 // ... // 需要重新开启扫描时,执行以下代码即可 // this.setState({ scanned: false }) }
- 方案2:如果需要保留原有的条件渲染逻辑,在重新开启扫描前增加短延迟,等待资源释放完成后再挂载组件
替换原有直接设置escaneando: true的逻辑为:
this.setState({ escaneando: false }, () => { setTimeout(() => { this.setState({ escaneando: true }) }, 50) })
- 方案3:升级依赖版本,你可以将
expo-barcode-scanner升级到11.2.0及以上的修复版本,或是将expo SDK升级到44及以上版本,官方已在后续迭代中修复了这个资源未正确释放的问题。
内容的提问来源于stack exchange,提问作者Backup Gov18
相关产品推荐
相关产品推荐

