react-native - 无效的 Hook 调用。钩子(Hook)只能在函数组件的主体内部调用,错误仅发生在浏览器中而不是移动设备上

标签 react-native react-hooks expo react-dom

无效的 Hook 调用。钩子(Hook)只能在函数组件的主体内部调用。发生这种情况可能是由于以下原因之一:

  1. 您的 React 和渲染器版本可能不匹配(例如 React DOM)
  2. 您可能违反了 Hooks 规则
  3. 您可能在同一应用中拥有多个 React 副本

当我尝试使用 Expo CLI 提供的相机 API 拍照时,出现此错误。我的实际问题是,它在我的 Android 设备上运行没有任何错误,但是每当我在浏览器(即 React DOM)上运行该应用程序时,它都会在控制台中产生此错误。

这是我从 expo doc 复制的代码,

import { Camera } from "expo-camera";
import { useEffect, useState } from "react";

const TakeImage = () => {
  const [hasPermission, setHasPermission] = useState(null);
  const [type, setType] = useState(Camera.Constants.Type.back);

  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>;
  }
  return (
    <View style={styles.container}>
      <Camera style={styles.camera} type={type}>
        <View style={styles.buttonContainer}>
          <TouchableOpacity
            style={styles.button}
            onPress={() => {
              setType(
                type === Camera.Constants.Type.back
                  ? Camera.Constants.Type.front
                  : Camera.Constants.Type.back
              );
            }}
          >
            <Text style={styles.text}> Flip </Text>
          </TouchableOpacity>
        </View>
      </Camera>
    </View>
  );
};

最佳答案

你不能在另一个钩子(Hook)中使用一个钩子(Hook),因为它违反了从React函数组件调用钩子(Hook)的规则,并且你传递给useEffect的函数是一个常规的javascript函数。您可以做的是在另一个自定义 Hook 中调用一个 Hook ,如下所示:

您的代码:

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

更改为:

useEffect(() => {
    checkPermissions();
  }, []);

const checkPermissions = async () => {
    const {status} = await Camera.requestCameraPermissionsAsync();
    setHasPermission(status === 'granted');
  };

关于react-native - 无效的 Hook 调用。钩子(Hook)只能在函数组件的主体内部调用,错误仅发生在浏览器中而不是移动设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71507392/

相关文章:

javascript - React Native FlatList 错误 -- "Possible Unhandled Promise Rejection (id: 0): undefined is not an object"

android - 如何在 React Native (Android) 的 Facebook 登录按钮中居中放置文本?

javascript - React useEffect() 无限循环

reactjs - 在 React 中使用 useMemo() 钩子(Hook)导致我的函数落后一步

javascript - react 。钩子(Hook)的所有部分具有相同状态的不同值

android - 找不到 androidx.appcompat :appcompat:28. 0.0

react-native - 如何向 React Native Picker 添加禁用选项

reactjs - axios.post 返回 400 React Native 的错误请求

javascript - 用于 React Native/JS 的 SHA256 ComputeHash(来自 C#)的等效版本

Android - 任务 :app:mergeDexRelease FAILED