react-native-vision-camera页面跳转后屏幕仍然是黑色的问题

1. 问题描述:

项目中使用react-native-vision-camera实现扫描解析二维码功能时,扫码页面扫码成功跳转其它页时,页面和相机页一样变成了黑色。

2. 解决方法:

开始是以为页面离开时相机没有关闭或者相机组件没有成功卸载,在设置了页面离开关闭相机之后发现还是黑屏。经过多次试验,camera组件的高度在设置成100%或设置flex: 1时均会出现这个问题。最后把高度调整后没有再出现黑屏问题。(只能算临时解决方案,后续会再寻找更好的方案)

代码如下:

import React, {useEffect, useState} from 'react';
import {
View,
StyleSheet,
Text,
Linking,
SafeAreaView,
Alert,
} from 'react-native';
import {
Camera,
useCameraDevice,
useCodeScanner,
} from 'react-native-vision-camera';
import {useIsForeground} from '../../hooks/useIsForeground';
import {useIsFocused} from '@react-navigation/core';
import {useNavigation} from '@react-navigation/native';
function Scan() {
const isFocussed = useIsFocused();
const isForeground = useIsForeground();
const isActive = isFocussed && isForeground;
const device = useCameraDevice('back');
const [cameraFlag, setCameraFlag] = useState(true);
useEffect(() => {
return () => {
// 在这里处理组件卸载时的清理工作
// 如果 VisionCamera 提供了清理方法,请在这里调用
setCameraFlag(false);
};
}, []);
// const handleCameraPermission = async () => {
// console.log('Requesting camera permission...');
// const permission = await Camera.requestCameraPermission();
// console.log(`Camera permission status: ${permission}`);
// if (permission === 'denied') {
// Alert.alert('摄像头被禁用。');
// await Linking.openSettings();
// }
// setCameraPermissionStatus(permission);
// };
const navigation = useNavigation();
const codeScanner = useCodeScanner({
codeTypes: ['qr', 'ean-13'],
onCodeScanned: codes => {
let value = codes[0]?.value;
let type = codes[0]?.type;
if (type === 'qr' && value) {
// setCameraFlag(false);
navigation.navigate('Detail', {
code: value,
});
}
},
});
return (
<SafeAreaView style={styles.container}>
{/* <RoundButtonWithImage /> */}
{device === null && cameraFlag ? (
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{margin: 10}}>找不到摄像头</Text>
</View>
) : (
<Camera
codeScanner={codeScanner}
style={styles.absoluteFill}
device={device}
isActive={isActive}
// torch={torchOn ? 'on' : 'off'}
// onTouchEnd={() => setEnableOnCodeScanned(true)}
/>
)}
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
// padding: 20,
backgroundColor: '#000',
},
absoluteFill: {
// flex: 1,
height: '80%',
},
});
export default Scan;
posted @   Li_pk  阅读(296)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示