You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:27:00