首页 > 解决方案 > 没有得到正确的 AsyncStorage.getItem() 返回

问题描述

我尝试使用同步功能从 AsyncStorage 中的键获取值并尝试在 console.log() 命令上打印该值在我的预期中是正确的,但是当我使用三元进行 if 时,它会出现这样的错误。

未捕获的错误:不变违规:不变违规:对象作为 React 子级无效(找到:带有键的对象{_40,_65,_55,_72)

这里是navigator react-native的部分代码

Guest:{
screen:MainScreen,
navigationOptions: ({navigation}) => ({
    headerLeft:
          (async () => {
              const login = await AsyncStorage.getItem("isLogin");
              (login == null) ?
              <Text></Text>
              :
              <Icon
                style={{ paddingLeft: 10, color: '#ffffff', }}
                onPress={() => navigation.openDrawer()}
                name="menu"
                size={30}
              />
          })

       ,
    headerTransparent:true,
 })

}

标签: reactjsreact-nativeasync-await

解决方案


您的headerLeft函数按原样返回 Promiseasync

headerLeft我猜必须返回 React.Element。

所以最好在那里删除异步并创建单独的组件

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

const getLogin = async(setLogin) => {
  const login = await AsyncStorage.getItem('isLogin');
  setLogin(login);
}

export const HeaderLeft = ({navigation}) => {
  const [login, setLogin] = useState(null);
  useEffect(() => {
    getLogin(setLogin);
  }, []);
  return (login == null)
    ? <Text/>
    : <Icon
        style={{ paddingLeft: 10, color: '#ffffff', }}
        onPress={() => navigation.openDrawer()}
        name="menu"
        size={30}
      />
}

并使用

...
headerLeft: <HeaderLeft navigation={navigation}/>
....

推荐阅读