Bac*_*v18 12 react-native expo
由于 Google Play 的原因,我必须将我的一个旧项目更新到最新的 expo 版本(确切地说是版本 43.0.0)。这个想法是让应用程序扫描二维码并简单地处理数据。但是,expo-barcode-scanner 只能工作一次,之后我需要关闭并再次打开应用程序才能工作。有没有人遇到过这个问题并且(或)知道如何解决它?下面是我的代码:
{escaneando ? (
<BarCodeScanner
barCodeTypes={[
BarCodeScanner.Constants.BarCodeType.ean13,
BarCodeScanner.Constants.BarCodeType.ean8,
BarCodeScanner.Constants.BarCodeType.upc_a,
BarCodeScanner.Constants.BarCodeType.upc_e,
]}
onBarCodeScanned={this.handleBarCode.bind(this)}
style={[StyleSheet.absoluteFillObject, styles.barscan]}
/>
) : null}
Run Code Online (Sandbox Code Playgroud)
及库规格:
"@react-native-community/masked-view": "^0.1.11",
"@react-native-community/netinfo": "^6.0.5",
"@react-navigation/native": "^6.0.6",
"@react-navigation/stack": "^6.0.11",
"expo": "~43.0.0",
"expo-av": "^10.1.3",
"expo-barcode-scanner": "^11.1.2",
"expo-status-bar": "~1.1.0",
"lodash": "^4.17.21",
"react": "17.0.1",
"react-dom": "17.0.1",
"react-native": "^0.64.2",
"react-native-dropdownalert": "^4.3.0",
"react-native-elements": "^3.4.2",
"react-native-gesture-handler": "^1.10.3",
"react-native-in-app-notification": "^3.2.0",
"react-native-offline": "^6.0.0",
"react-native-paper": "^4.10.0",
"react-native-reanimated": "^2.2.3",
"react-native-safe-area-context": "^3.3.2",
"react-native-screens": "^3.9.0",
"react-native-web": "0.17.1",
"react-navigation": "^4.4.4",
"react-redux": "^7.2.6",
"redux": "^4.1.2",
"redux-thunk": "^2.4.0",
"reselect": "^4.1.2"
Run Code Online (Sandbox Code Playgroud)
与expo-camera
它完美配合。
1)-安装expo-camera
:expo install expo-camera
这是它的代码:
import React, { useState, useEffect } from 'react';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
import { Camera } from 'expo-camera';
const QrcodeReader = ({navigation}) => {
const [hasPermission, setHasPermission] = useState(null);
const [type, setType] = useState(Camera.Constants.Type.back);
useEffect(() => {
(async () => {
const { status } = await Camera.requestCameraPermissionsAsync();
setHasPermission(status === 'granted');
})();
}, []);
if (hasPermission === null) {
return <View />;
}
if (hasPermission === false) {
return <Text>No access to camera</Text>;
}
return(
<View style={styles.container}>
<Camera
onBarCodeScanned={(...args) => {
const data = args[0].data;
result = JSON.stringify(result);
console.log(result);
navigation.navigate('your_next_screen',{result});
);
}}
barCodeScannerSettings={{
barCodeTypes: ['qr'],
}}
style={{ flex: 1 }}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
camera: {
flex: 1,
},
buttonContainer: {
flex: 1,
backgroundColor: 'transparent',
flexDirection: 'row',
margin: 20,
},
button: {
flex: 0.1,
alignSelf: 'flex-end',
alignItems: 'center',
},
text: {
fontSize: 18,
color: 'white',
},
});
export default QrcodeReader;
Run Code Online (Sandbox Code Playgroud)
小智 7
我遇到了同样的问题,因为这是一个我无法工作的功能,所以我坚持并找到了一个适合我的解决方案。
由于仅支持一个活动的 BarCodeScanner 预览,因此我对导航进行了反应,并找到了一种在屏幕聚焦时重新渲染条形码扫描仪的方法。
从'@react-navigation/native'导入{useIsFocused};当带有条形码扫描仪的屏幕处于焦点状态时,useIsFocused 返回 true。
{isFocused ? (
<BarCodeScanner
onBarCodeScanned={scanned ? undefined : handleBarCodeScanned}
style={StyleSheet.absoluteFillObject}
/>) : null}
Run Code Online (Sandbox Code Playgroud)
阅读更多内容https://reactnavigation.org/docs/use-is-focused。
完整示例:
import React, { useState, useEffect } from 'react';
import { Text, View, StyleSheet, Button } from 'react-native';
import { BarCodeScanner } from 'expo-barcode-scanner';
import { useIsFocused } from '@react-navigation/native';
export default function App() {
const [hasPermission, setHasPermission] = useState(null);
const [scanned, setScanned] = useState(false);
console.log(hasPermission, scanned);
const isFocused = useIsFocused();
useEffect(() => {
(async () => {
setScanned(false);
const { status } = await BarCodeScanner.requestPermissionsAsync();
setHasPermission(status === 'granted');
})();
}, []);
const handleBarCodeScanned = ({ type, data }) => {
setScanned(true);
alert(`Bar code with type ${type} and data ${data} has been scanned!`);
};
if (hasPermission === null) {
return <Text>Requesting for camera permission</Text>;
}
if (hasPermission === false) {
return <Text>No access to camera</Text>;
}
return (
<View style={styles.container}>
{isFocused ? (
<BarCodeScanner
onBarCodeScanned={scanned ? undefined : handleBarCodeScanned}
style={StyleSheet.absoluteFillObject}
/>
) : null}
{scanned && (
<Button title={'Tap to Scan Again'} onPress={() => setScanned(false)} />
)}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
justifyContent: 'center',
},
});
Run Code Online (Sandbox Code Playgroud)
欢迎@Backup Gov18,
这是一个有记录的问题。
注意:当前仅支持一种活动的 BarCodeScanner 预览。使用导航时,最佳实践是卸载任何先前呈现的 BarCodeScanner 组件,以便可以毫无问题地使用以下屏幕。
有一个解决方法。
<BarcodeScanner />
您可以将其渲染在另一个专用屏幕组件内,而不是有条件地渲染该组件。
这样,在这个新屏幕读取条形码后,您可以导航回第一个屏幕。向后导航可能会卸载这个新屏幕。如果需要,您可以强制卸载。
当你使用时react-navigation
,你最好使用.pop()
而不是goBack()
。
您也可以使用expo-camera
代替expo-barcode-scanner
. expo-camera
没有这个问题。它还提供更多选项,例如手电筒/手电筒和切换摄像头。
归档时间: |
|
查看次数: |
9168 次 |
最近记录: |