Reactjs react函数、ImagePicker和ActionSheet中的钩子调用无效

Reactjs react函数、ImagePicker和ActionSheet中的钩子调用无效,reactjs,react-native,react-native-android,react-hooks,Reactjs,React Native,React Native Android,React Hooks,我真的需要一些帮助,在反应本地钩子 我有一个行动表,按下其中一个选项,相机功能应该打开“使用相机”功能 “useCamera”在另一个功能中(在另一个文件中), 使用库“ImagePicker”。(特定的“图像采集器启动摄像头”) “ImagePicker.launchCamera”在回调函数中设置fileUri,而函数不返回任何内容 因此,为了访问fileUri,我尝试使用useState钩子,但得到“错误:钩子调用无效。钩子只能在函数体内部调用…” 但是钩子在功能体里面 行动表代码:

我真的需要一些帮助,在反应本地钩子

我有一个行动表,按下其中一个选项,相机功能应该打开“使用相机”功能

“useCamera”在另一个功能中(在另一个文件中), 使用库“ImagePicker”。(特定的“图像采集器启动摄像头”)

“ImagePicker.launchCamera”在回调函数中设置fileUri,而函数不返回任何内容

因此,为了访问fileUri,我尝试使用useState钩子,但得到“错误:钩子调用无效。钩子只能在函数体内部调用…” 但是钩子在功能体里面

行动表代码:

    import {useCamera} from './PhotoHandle';

// export default class EditProfilePic extends React.Component {
function EditProfilePic(props) {
  const [ActionSheetRef, setActionSheetRef] = useState(null);
  const [fileDate, setFileDate] = useState(null);

  return (
    <View style={styles.images_container}>
      <TouchableOpacity
        style={styles.click_edit_icon}
        onPress={() => ActionSheetRef.show()}>
        <Image style={styles.editIcon} source={editIcon} />
      </TouchableOpacity>
      <Image source={props.profileSource} style={styles.image} />
      <ActionSheet
        ref={o => setActionSheetRef(o)}
        title={
          <Text style={{color: '#000', fontSize: 18}}>
            Which one do you like?
          </Text>
        }
        options={['Select from Photos', 'Camera', 'Cancel']}
        cancelButtonIndex={2}
        destructiveButtonIndex={2}
        onPress={index => {
          //camera
          if (index == 1) {
            useCamera()
          }
        }}
      />
    </View>
  );
}
export function useCamera() {
  const [fileData, setFileData] = useState(null);
  let options = {
    storageOptions: {
      skipBackup: true,
      path: 'images',
    },
  };

  ImagePicker.launchCamera(options, response => {
    console.log('coolio' + response);
    if (response.didCancel) {
      console.log('User cancelled image picker');
    } else if (response.error) {
      console.log('ImagePicker Error: ', response.error);
    } else if (response.customButton) {
      console.log('User tapped custom button: ', response.customButton);
      alert(response.customButton);
    } else {
      setFileData(response.data);
    }
  });
  return fileData;
}
我试图调用useCamera(),比如“”,
我将匿名函数更改为一个函数。
我试图从代码的其他部分(不是从onPress)调用useCamera() 我尝试使用上下文和Redux

都是相同的错误。
请帮助我,

谢谢

我以前也遇到过这个问题,您使用的是什么版本的React Native

React 16.8.0是支撑挂钩的第一个版本。升级时,不要忘记更新所有包,包括React DOM。自0.59版本的React-Native以来,React-Native支持挂钩


我看到一个符号,您调用
this.setState
,这意味着您正在使用基于类的组件。 react挂钩只能在功能部件中使用。
您必须将名为
LaunchCamera()
(应重命名为
useCamera()
)的组件转换为功能组件。

是否应将
LaunchCamera
这样大写?它不是一个组件。您违反了约定,因为LaunchCamera()是一个自定义挂钩,它应该命名为“useCamera”,我不知道更改名称是否有效,让我们试试看,让我知道尝试过,没有:(…您也违反了钩子的另一个规则,您在
if
中调用了自定义钩子,尝试在
ActionSheet
()上面调用它,让我知道我删除了if,仍然得到相同的错误“react”:“16.11.0”,“react native”:“0.62.0”,LaunchCamera()(在我的代码中已重命名为useCamera())是一个函数。确实是从类调用的函数;这是一个问题吗?必须转换的组件是呈现您的组件。您误解了这一点,useCamera是一个自定义挂钩,并且您在基于类的组件中调用它,这是不允许的。请按照本指南进行转换()嗯..我把呈现我的函数的组件改成了一个函数,仍然是相同的错误。你能把整个组件放到问题中吗?