Expo Camera报错:Cannot read property 'Type' of undefined 求助
解决Expo Camera开发中TypeError: Cannot read property 'Type' of undefined的问题
错误信息
TypeError: Cannot read property 'Type' of undefined 错误栈: in HomePage (created by App) in App (created by withDevTools(App)) in withDevTools(App) in RCTView (created by View) in View (created by AppContainer) in RCTView (created by View) in View (created by AppContainer) in AppContainer in main(RootComponent), js engine: hermes
问题代码
import React, { useState, useEffect, useRef } from 'react'; import { SafeAreaView, View, Text, TouchableOpacity, StyleSheet } from 'react-native'; import { Camera } from 'expo-camera'; export default function HomePage() { const [hasCameraPermission, setHasCameraPermission] = useState(null); const cameraRef = useRef(null); useEffect(() => { (async () => { const { status } = await Camera.requestCameraPermissionsAsync(); setHasCameraPermission(status === 'granted'); })(); }, []); const requestPermission = async () => { const { status } = await Camera.requestCameraPermissionsAsync(); setHasCameraPermission(status === 'granted'); }; const takePicture = async () => { if (cameraRef.current) { try { const { uri } = await cameraRef.current.takePictureAsync(); console.log('Picture taken:', uri); } catch (error) { console.error('Error taking picture:', error); } } }; return ( <SafeAreaView style={styles.container}> <View style={styles.cameraContainer}> {hasCameraPermission === null ? ( <Text>Waiting for camera permission...</Text> ) : hasCameraPermission === false ? ( <Text>Camera permission denied.</Text> ) : ( <Camera style={styles.camera} type={Camera.Constants.Type.back} ref={cameraRef} /> )} </View> <View style={styles.buttonContainer}> <TouchableOpacity style={styles.button} onPress={requestPermission}> <Text style={styles.buttonText}>Allow Permission</Text> </TouchableOpacity> <TouchableOpacity style={styles.button} onPress={takePicture}> <Text style={styles.buttonText}>Take Picture</Text> </TouchableOpacity> </View> </SafeAreaView> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#f0f0f0', }, cameraContainer: { width: '100%', height: '70%', justifyContent: 'center', alignItems: 'center', backgroundColor: 'black', }, camera: { width: '100%', height: '100%', }, buttonContainer: { flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center', width: '100%', marginTop: 20, }, button: { backgroundColor: '#3ABEF9', paddingVertical: 15, paddingHorizontal: 30, borderRadius: 10, }, buttonText: { color: 'white', fontWeight: 'bold', fontSize: 16, }, });
app.json配置
{ "expo": { "name": "k", "slug": "k", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "light", "splash": { "image": "./assets/splash.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, "plugins": [ [ "expo-camera", { "cameraPermission": "Allow $(PRODUCT_NAME) to access your camera." } ] ], "ios": { "supportsTablet": true }, "android": { "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#ffffff" } }, "web": { "favicon": "./assets/favicon.png" } } }
问题原因
Expo Camera从v13版本开始移除了Camera.Constants.TypeAPI,改用直接导出的CameraType枚举指定相机类型,原代码访问Camera.Constants.Type会导致Type为undefined,触发错误。
解决方案
- 修改导入语句,添加
CameraType的导入:
import { Camera, CameraType } from 'expo-camera';
- 替换相机类型引用,将
Camera.Constants.Type.back改为CameraType.back:
<Camera style={styles.camera} type={CameraType.back} ref={cameraRef} />
修改后的完整代码
import React, { useState, useEffect, useRef } from 'react'; import { SafeAreaView, View, Text, TouchableOpacity, StyleSheet } from 'react-native'; import { Camera, CameraType } from 'expo-camera'; export default function HomePage() { const [hasCameraPermission, setHasCameraPermission] = useState(null); const cameraRef = useRef(null); useEffect(() => { (async () => { const { status } = await Camera.requestCameraPermissionsAsync(); setHasCameraPermission(status === 'granted'); })(); }, []); const requestPermission = async () => { const { status } = await Camera.requestCameraPermissionsAsync(); setHasCameraPermission(status === 'granted'); }; const takePicture = async () => { if (cameraRef.current) { try { const { uri } = await cameraRef.current.takePictureAsync(); console.log('Picture taken:', uri); } catch (error) { console.error('Error taking picture:', error); } } }; return ( <SafeAreaView style={styles.container}> <View style={styles.cameraContainer}> {hasCameraPermission === null ? ( <Text>Waiting for camera permission...</Text> ) : hasCameraPermission === false ? ( <Text>Camera permission denied.</Text> ) : ( <Camera style={styles.camera} type={CameraType.back} ref={cameraRef} /> )} </View> <View style={styles.buttonContainer}> <TouchableOpacity style={styles.button} onPress={requestPermission}> <Text style={styles.buttonText}>Allow Permission</Text> </TouchableOpacity> <TouchableOpacity style={styles.button} onPress={takePicture}> <Text style={styles.buttonText}>Take Picture</Text> </TouchableOpacity> </View> </SafeAreaView> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#f0f0f0', }, cameraContainer: { width: '100%', height: '70%', justifyContent: 'center', alignItems: 'center', backgroundColor: 'black', }, camera: { width: '100%', height: '100%', }, buttonContainer: { flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center', width: '100%', marginTop: 20, }, button: { backgroundColor: '#3ABEF9', paddingVertical: 15, paddingHorizontal: 30, borderRadius: 10, }, buttonText: { color: 'white', fontWeight: 'bold', fontSize: 16, }, });
额外检查
- 确保
expo-camera版本为v13及以上,可查看package.json确认,版本过低时执行npx expo install expo-camera更新至适配当前Expo SDK的版本。 - app.json中的权限配置已正确设置,无需修改。
内容的提问来源于stack exchange,提问作者Emre
相关产品推荐
相关产品推荐

