如何在 react-native-qrcode-scanner 中关闭 camera/scanner?

How do I shut of camera/scanner in react-native-qrcode-scanner?

当前代码:

import QRCodeScanner from 'react-native-qrcode-scanner';
function ScanScreen({ navigation }) {
  return (
    <SafeAreaView style={styles.screen}>
      <QRCodeScanner reactivate={true} reactivateTimeout={3000}
        onRead={data => navigation.navigate('Third', {target:data.data})}
      />
    </SafeAreaView>
  );
}

它有效,但这是我想要做的: 用户可以在屏幕之间导航,其中之一是二维码扫描仪。 扫描时,我需要对扫描仪进行去抖动处理,这样它就不会继续生成 onRead 事件。用户可以 a) 在不读取 QR 码的情况下在扫描屏幕中开始扫描,然后手动导航到另一个屏幕。 b) 读取一个二维码自动移到另一个屏幕进行处理,然后返回再次扫描。 出于这个原因,我需要在一段合理的时间后重新启用扫描仪。 我不能只将 reactivate 设置为 false,因为在我重新启动应用程序之前,QR 扫描仪处于非活动状态。 问题是,当用户停留在另一个屏幕时,QR 扫描仪会在超时后重新激活,并在不需要时尝试扫描。我理想的做法是在用户不在扫描屏幕时停用 QR 扫描仪,并在用户进入扫描屏幕时使用上述参数重新激活它。 有什么办法吗?谢谢!

我遇到了几乎相同的问题。扫描仪在显示另一个视图时不会停止扫描(使用 reactivate={true})。我正在使用反应导航,所以我想到了以下解决方案。

您可以通过 focusblur 来了解您的视图发生了什么。

this.props.navigation.addListener('focus', () => {
    this.setState({viewFocused: true});
});

this.props.navigation.addListener('blur', () => {
    this.setState({viewFocused: false});
});

注意:您将这段代码放在 componentDidMount 或使用 React.useEffect.

根据状态 viewFocused 您可以渲染二维码扫描器。

this.state.viewFocused && (
    <QRCodeScanner
        onRead={onRead}
        reactivate={true}
        reactivateTimeout={2000}
    /> );

这有助于我解决问题。在显示其他视图时不进行扫描,而是在再次显示该视图时进行扫描。归功于 pkyeck on github.com

如文档中所述,您可以通过编程方式完成

  <QRCodeScanner
      onRead={this.onSuccess}
      ref={(node) => { this.scanner = node }}  <-- add this
    />

并在您的方法中(例如,在 Alert 或 onPress 按钮中),像这样激活扫描器:

 onPress: () => {
      this.scanner.reactivate()
    },

在功能组件或使用钩子中与上面提到的相同

import React, {useEffect, useState} from 'react';

const ScannerCamera = ({navigation, route}) => {
  let uuId = null;
  const [viewFocused, setViewFocused] = useState(false);

  useEffect(() => {
    const onFocus = navigation.addListener('focus', () => {
      setViewFocused(true);
    });

    const onBlur = navigation.addListener('blur', () => {
      setViewFocused(false);
    });

    return {onFocus, onBlur};
  }, [navigation]);

  return (
    viewFocused && (
      <QRCodeScanner
        containerStyle={{height: SCREEN_HEIGHT}}
        cameraStyle={[{height: SCREEN_HEIGHT}]}
        showMarker={true}
        onRead={onSuccess}
        flashMode={RNCamera.Constants.FlashMode.auto}
      />
    )
  );
};

使用 React 挂钩:

let scanner = useRef(null);

<QRCodeScanner
onRead={onSuccess}
ref={node => { scanner = node;}}
/>

然后你可以把它附加到一个按钮上。例如:

onPress={() => scanner.reactivate()}