TypeError:未定义不是一个对象(评估'_this.camera = _ref')
2022-03-13
3076
-React Native 中的应用开发- 您好, 我遇到了 Expo Camera 问题。当您想要拍照时,会出现错误。
“TypeError:undefined 不是对象(评估“_this.camera = _ref”)”/Scan.js。
如果应用程序刚刚使用 Expo 更新,则一切正常。但是,只要您继续编程并出现另一个错误,就会出现此错误,并且直到您再次刷新应用程序才会消失。
我尝试了很多方法,但我需要帮助。
Scan.js
import React, { Component, useState, useEffect } from 'react';
import { View, Text, StyleSheet, TouchableOpacity, Image } from 'react-native';
import {launchCamera, launchImageLibrary} from 'react-native-image-picker';
import {Camera, Constants} from 'expo-camera';
import * as MediaLibrary from 'expo-media-library';
import * as Haptics from 'expo-haptics';
import Images from '../assets/icon/index'
const Scan = () => {
const [hasPermission, setHasPermission] = useState(null);
const [type, setType] = useState(Camera.Constants.Type.back);
const [status, requestPermission] = MediaLibrary.usePermissions();
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>;
}
takePicture = async () => {
if (this.camera) {
let photo = await this.camera.takePictureAsync();
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
console.log(photo.uri);
MediaLibrary.saveToLibraryAsync(photo.uri);
}
};
return (
<View style={styles.container}>
<Camera style={styles.camera}
type={type}
ref={ref => {
this.camera = ref;
}}>
<View style={styles.buttonContainer}>
<TouchableOpacity
style={styles.button}
onPress={() => {
setType(
type === Camera.Constants.Type.back
? Camera.Constants.Type.front
: Camera.Constants.Type.back
);
}}
>
<Image source={Images.camera} style={styles.icon}></Image>
</TouchableOpacity>
<TouchableOpacity
style={styles.button}
onPress={takePicture}
>
<Text style={styles.text}>Take</Text>
</TouchableOpacity>
</View>
</Camera>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
camera: {
flex: 1,
},
buttonContainer: {
flex: 1,
backgroundColor: 'transparent',
flexDirection: 'row',
margin: 20,
top: 0,
},
button: {
flex: 0.1,
alignSelf: 'flex-end',
alignItems: 'center',
},
text: {
fontSize: 18,
color: 'white',
},
icon : {
tintColor: 'white',
},
})
export default Scan; ```
2个回答
创建一个新的相机引用并将其附加到
Camera
组件。
import { useRef } from 'react';
...
const cameraRef = useRef<Camera>(null);
...
<Camera ref={cameraRef} ... />
在您的
takePicture
函数中,将
this.camera.takePictureAsync
替换为
cameraRef.current?.takePictureAsync
KKK
2022-03-14
错误:函数组件不能具有字符串引用。我们建议改用 useRef()。在此处了解有关安全使用引用的更多信息: https://reactjs.org/link/strict-mode-string-ref 。
这是因为回答者使用了 TypeScript。
只需将
const cameraRef = useRef(null);
替换为
const cameraRef = useRef(null);
Bobby Joe
2022-12-03