如何将 React Native AsyncStorage 与 React hooks 一起使用?

How can I use React Native AsyncStorage with React hooks?

我已经像这样设置了 React 上下文:

export const TokenContext = createContext({token: ''});

我正在使用它在我的 App.js 中创建一个提供者,我试图首先从 AsyncStorage 检索令牌:

const App = () => {

    const [token, setToken] = React.useState('');

    const retrieveData = async () => {
        const storedToken = await AsyncStorage.getItem('token');
        console.log(storedToken);
        setToken(storedToken);

        return;
    };

    React.useEffect(() => {
        retrieveData();
    }, []);

    return (
        <NavigationContainer>
            <TokenContext.Provider token={token}>
                <RootNav  />
            </TokenContext.Provider>
        </NavigationContainer>
    );
};

我想在上面使用的 RootNav 组件中使用该上下文:

const RootNav = () => {
    const token = React.useContext(TokenContext);
    const isSignedIn = !!token;

    return (
        <Root.Navigator>
            {isSignedIn ? (
                <>
                    <Root.Screen name={RouteNames.TAB_NAV} component={TabNav} />
                </>
            ) : (
                <>
                    <Root.Screen
                        name={RouteNames.LOGIN_SCREEN}
                        component={LoginScreen}
                    />
                </>
            )}
        </Root.Navigator>
    );
};

但是,即使存储中有值,上下文中的令牌值仍未定义。如果我手动将 prop 传递给 RootNav(没有上下文),我可以很好地使用它,如下所示:

App.js

...
  return (
        <NavigationContainer>
             <RootNav token={token} />
        </NavigationContainer>
    );

RootNav.js


const RootNav = ({token}) => {
    const isSignedIn = !!token;

    return (
    ...

但是,我想在嵌套更多的地方使用这个标记,所以如果我可以让它工作,我宁愿只使用上下文。有任何想法吗?

传递带有价值的令牌

    <NavigationContainer>
        <TokenContext.Provider value={{token}}>
            <RootNav  />
        </TokenContext.Provider>
    </NavigationContainer>

在消费者中

const {token} = React.useContext(TokenContext);

尝试使用对象而不是字符串。