React Native Expo:ViewPager中的相机

时间:2020-11-10 06:10:25

标签: reactjs react-native expo react-native-camera expo-camera

我正在创建一个ViewViewr,其中在View中包含一个Camera,当ViewPager呈现View时,一切正常,但是当ViewPager更改页面并返回到Camera Page时,Camera不再出现。如何解决呢?有没有一种方法可以异步渲染相机?

这是我的ViewPager:

import React from 'react';
import ViewPager from '@react-native-community/viewpager';
import { View } from 'react-native';

const Pager = ({
    pages,
    initalPage,
    onPageSelected,
    onPageScrollStateChanged,
    onPageScroll
}) => {
    return (
        <ViewPager 
            style={{flex: 1}} 
            initialPage={initalPage} 
            onPageSelected={(e)=>onPageSelected && onPageSelected(e.nativeEvent)}
            onPageScrollStateChanged={(e)=>onPageScrollStateChanged && onPageScrollStateChanged(e.nativeEvent)}
            onPageScroll={(e)=>onPageScroll && onPageScroll(e.nativeEvent)}
        >
            {
                pages.map((page,i)=>
                    <View key={i} style={{flex: 1}}>
                        {
                            page
                        }
                    </View>
                )
            }
        </ViewPager>
    )
}
export default Pager;

这是我的相机页面:

import React, { useEffect, Suspense, useState } from 'react';
import { StyleSheet, View } from 'react-native';
import { Camera } from 'expo-camera';
import { LinearGradient } from 'expo-linear-gradient';
import { color } from '../../utils';

const ScannerView = ({
    isInView,
}) => {

    let camera = null;

    const [hasPermission, setHasPermission] = useState(null);
    const [cameraRatio, setCameraRatio] = useState('1:1');

    useEffect(()=>{
        (async () => {
            const { status } = await Camera.requestPermissionsAsync();
            setHasPermission(status === 'granted');
        })();
    }, []);

    const handleCameraReady = () => {
        camera.getSupportedRatiosAsync().then((data)=>{
            setCameraRatio(data[data.length-1]);
        });
    }

    const handleBarcodeScanned = (data) => {
        console.log(data);
    }

    const handleThis = (err) => {
        console.log("EVENT",err.nativeEvent)
    }


    const renderCamera = (
        <Camera
            ref={ref=>{
                camera=ref;
            }}
            style={styles.camera}
            type={Camera.Constants.Type.back}
            focusable={true}
            ratio={cameraRatio}
            onCameraReady={handleCameraReady}
            onBarCodeScanned={handleBarcodeScanned}
            onMountError={handleThis}
        />
    )

    return (
        <View style={styles.container}>
            {
                (hasPermission) &&
                <Suspense>
                    {renderCamera}
                </Suspense>
                
            }
            <LinearGradient
                colors={['transparent', color.neutral80]}
                style={styles.gradient}
            />
        </View>
    )
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: 'black',
        alignItems: 'stretch'
    },
    camera: {
        flex: 1,
        backgroundColor: 'red',
    },
    gradient: {
        flex: 1,
        height: 220,
        position: 'absolute',
        bottom: 0,
        left: 0,
        right: 0
    }
})

export default ScannerView;

0 个答案:

没有答案
相关问题