Reactjs React Native无法使用异步存储中的数据更新状态挂钩

Reactjs React Native无法使用异步存储中的数据更新状态挂钩,reactjs,react-native,react-native-android,asyncstorage,Reactjs,React Native,React Native Android,Asyncstorage,您好,我正在学习react native中的异步存储。 所以我写了一些这样的状态 const [isLoading,setIsLoading] = useState(true) const [id, setId] = useState(null) setAsyncStorage('id', JSON.stringify(loginData.id)) 我将其设置为null是因为我想从AsyncStorage获取id,所以我编写了一个简单的函数来获取和设置值,如下所示: async functi

您好,我正在学习react native中的异步存储。 所以我写了一些这样的状态

const [isLoading,setIsLoading] = useState(true)
const [id, setId] = useState(null)
setAsyncStorage('id', JSON.stringify(loginData.id))
我将其设置为null是因为我想从AsyncStorage获取id,所以我编写了一个简单的函数来获取和设置值,如下所示:

async function getAsyncStorageId(){
  const userId = await AsyncStorage.getItem('id')
  console.log('user id from AsyncStorage is: ',userId)
  setId(userId)
  console.log('state hooks id : ',id)
}
我把它投入使用

 useEffect(()=>{
  getAsyncStorageId()
 },[])
所以我测试我的代码,id状态不会更新它,但console.log(userId)有一个id值

user id from AsyncStorage is:  6
state hooks id :  null
我不知道为什么我不能用异步存储中的值设置状态

======================= *编辑:这是我用来在异步存储中设置id的代码。 我将此代码放在我的登录屏幕中,因此当用户成功登录时,我将id、用户名、令牌和角色存储在异步存储中

const login = async () => {
try {
  let response = await axios.post(`${url}/users/login`, {
    email: props.email,
    password: props.password,
  });
  let loginData = response.data;
  console.log(loginData,'sukses login')
  setAsyncStorage('token',loginData.token)
  loginData.name === null ? setAsyncStorage('name', 'pengguna') : setAsyncStorage('name',loginData.name)
  setAsyncStorage('role', loginData.role)
  setAsyncStorage('id', loginData.id)

  props.navigation.navigate("Artikel",{
    id:loginData.id,
    token:loginData.token,
    name:loginData.name
  })

} catch (error) {
  console.log('error login',props.email,props.password);
  alert(error.response.data.message)
}
})

export const setAsyncStorage=async(键,值)=>{
试一试{
等待AsyncStorage.setItem(`${key}`、`${value}`);
}捕获(错误){
console.log(错误);
}

};
我认为您只能将
字符串
类型存储在
异步存储
中。尝试这样设置值

AsyncStorage.setItem('id', '5')
你的情况是这样的

const [isLoading,setIsLoading] = useState(true)
const [id, setId] = useState(null)
setAsyncStorage('id', JSON.stringify(loginData.id))
更新:

const [id, setId] = useState('')

您能告诉我您在
AsyncStorage
中设置
id
的代码吗?
setId
是异步的,所以调用
setId
id
被记录为空是正常的。只需在
setId(userId)
之前添加
wait
,通常它应该work@MahdiN我已经尝试过了,但是值仍然是“null”@MahdiN,但是当我编辑我的代码(在任何地方)时,应用程序会自动刷新,并且不知何故,值发生了变化,但是,当我重建并直接转到profilescreen时,它不会改变,我认为这是因为快速刷新,当您更改代码时,仿真器会用新代码刷新。我确定问题出在asynchronous
setId
,在useEffect中调用
GetAsynchStorageId
后尝试控制台日志id,并将wait添加到GetAsynchStorageIDMy SetAsynchStorage自动将编号更改为string问题是我无法使用async storage的值更改我的状态挂钩