React 检测到调用的 Hooks 顺序发生了变化

React has detected a change in the order of Hooks called

我刚开始学习 React Native,我正在尝试创建一个使用 NativeBase ActionSheet 组件的登录屏幕,但我一直收到一个错误 React has detected a change in the order of Hooks called

我认为这是因为 fontsLoaded 布尔值被异步加载,但我不确定。处理异步方法并确保正确加载屏幕的正确方法是什么?

这是我的代码:

function LoginScreen() {
let [fontsLoaded] = useFonts({
    HammersmithOne_400Regular,
})

if (!fontsLoaded) {
    return <AppLoading />;
}

const {
    isOpen,
    onOpen,
    onClose
  } = useDisclose();

return (
    <View style={styles.container}>
        <Text style={styles.logo}>Logo</Text>

        <View style={styles.signInContainer}>
            <Button onPress={onOpen} title="Log in">
                Log in
            </Button>
            <Actionsheet isOpen={isOpen} onClose={onClose}>
                <Actionsheet.Content>
                    <Box w="100%" h={60} px={4} justifyContent="center">
                        <Text>
                            Albums
                        </Text>
                    </Box>
                </Actionsheet.Content>
            </Actionsheet>
        </View>
    </View>
);

}

你违反了 hook-rule,因为你在 if (!fontsLoaded) { return 之后有条件地调用 useDisclose }

必须在组件的顶层调用挂钩。

在这里你可以找到更多关于反应文档中所有钩子规则的信息: https://reactjs.org/docs/hooks-rules.html

为了解决您的问题,您必须在 if 语句之前调用 useDisclose。

将 useDisclose 挂钩移至顶部,将 if 语句移至下方。 这是原因why

   let [fontsLoaded] = useFonts({
    HammersmithOne_400Regular,
})

const {
    isOpen,
    onOpen,
    onClose
  } = useDisclose();

if (!fontsLoaded) {
    return <AppLoading />;
}