我试图使一个应用程序,基本上必须能够连续扫描Qr码。它看起来像这样(省略了无用的部分):
const QRScanner = () => {
const [scanned, setScanned] = useState(false);
const [result, setResult] = useState('Nothing scanned yet');
const scanHandler = ({type, data}) => {
setScanned(true);
setResult(data);
setTimeout(() => {
setScanned(false);
}, 3000);
}
return (
<View>
<Camera
onBarcodeScanned={scanned ? undefined: scanHandler}
>
<Text>{result}</Text>
</Camera>
</View>
)
}
不幸的是,在执行过程中,Camera模块似乎只能扫描一次任何类型的条形码。这应该已经解决与世博会的发行版本45.0.6(如图所示),但即使在更新后,我有同样的问题。
任何帮助都是感激的。
我在android设备上遇到了同样的问题。我找到了以下三个可行的解决方案:
解决方案1:
该问题已在以下版本中修复:
- "expo"^ 46.0.0",
- "expo-camera"~ 12.3.0",
先升级expo-cli,再升级项目中的expo SDK:
1. npm i -g expo-cli
2. expo upgrade 46
解决方案2:将expo-camera库替换为expo-barcode-scanner。执行如下命令:
expo install expo-barcode-scanner
并将<Camera>
标签替换为<BarCodeScanner>
。
解决方案3:
将key
prop传递给<Camera>
组件,并在onBarCodeScanned
回调上更新键,如下所示。
const [isScanned, setIsScanned] = useState(false);
<Camera
key={isScanned ? 1 : 2}
onBarCodeScanned={(result) => {
handleOnBarCodeScanned(result);
setIsScanned(!isScanned);
}}
/>
似乎你已经逆转了在scanHandler中切换扫描值的逻辑:
const scanHandler = ({type, data}) => {
setScanned(false); // <----- change this
setResult(data);
setTimeout(() => {
setScanned(true); // <----- change this
}, 3000);
}
:
<Camera onBarcodeScanned={scanned && scanHandler} >