【问题标题】:AsyncStorage getItem() doesn't return null everAsyncStorage getItem() 永远不会返回 null
【发布时间】:2021-08-26 10:34:23
【问题描述】:

我在 React Native 应用程序中使用 AsyncStorage,并且(如果我理解正确的文档)如果没有为给定键存储任何内容,getItem() 方法应该返回 null。

来自文档:

getItem() ... 返回:如果给定键存在条目,则使用字符串值解析 Promise,否则返回 null。"

但是,每当我为新密钥获取数据时,它永远不会为空。我的 getItem 函数位于 useEffect 挂钩中,用于尝试在第一次渲染之前加载数据。

useEffect(() => {
  getData();
}, []);

 const storeData = async () => {
    try {
      setMyInfo({...})
      const jsonInfo = JSON.stringify({myInfo})
      await AsyncStorage.setItem(storage_Key, jsonInfo)
      alert('Data successfully saved')
    } catch (e) {
      alert('Failed to save the data to the storage')
    }
  }

const getData = async () => {
  try {
    let data = await AsyncStorage.getItem(storage_Key);
    if (data !== null) {
      setMyInfo(JSON.parse(data));
    } else {
      alert("test");
    }
  } catch (e) {
    alert("Failed to fetch the data from storage");
  }
};

myInfo,该变量是一个 JSON 对象,它实际上似乎用“无用占位符”填充了所有值。像这样:

myInfo = {
  value1: "Useless Placeholder",
  value2: "Useless Placeholder",
};

我目前的解决方案:

即使 getItem() 函数在 useEffect 钩子内,myInfo 变量在开始时对于 half second 是未定义的。因此,如果定义了变量,我有一个三元运算符来显示值。

<Text>{typeof myInfo === 'undefined' ? '' : myInfo.value1}</Text>

如果我只是尝试显示myInfo.value1,它将引发“myInfo is undefined”错误。但是,这样一来,即使在为指定键存储任何数据之前,打开此页面时也会出现“无用占位符”的值。

目前这对我有用,但我们将不胜感激有关如何在此处实际使用 asynstorage 的一些指导。

【问题讨论】:

  • 那么你得到什么而不是'null'?
  • 这很奇怪。它作为所有值都是“无用占位符”的 JSON 对象返回。这不是我曾经存储过的东西。即使在保存了一些不是“无用占位符”的新数据然后重新启动开发过程之后,它仍然会返回该结构和值。奇怪的是我也没有指定 JSON 结构。在第一次渲染时,我用那个键提取数据

标签: react-native asyncstorage


【解决方案1】:

我知道发生了什么。

事实证明,在存储数据时,useState 变量没有被设置为新值。我发现如果我尝试两次触发 storeData 函数,它实际上会正确保存数据。因此,为了解决这个问题,我将 storeData 函数更改为以下内容:

 const storeData = async () => {
    try {
      const jsonRnfo = JSON.stringify({
         value1: value,
         value2: value, ....
      })
      await AsyncStorage.setItem(storage_Key, jsonInfo)
      alert('Data successfully saved')
    } catch (e) {
      alert('Failed to save the data to the storage')
    }
  }

我没有使用 AsyncStorage.setItem() 来存储来自 useState 的数据,而是在我的 storeData 函数中构建了一个新的 JSON 对象。 useState 仍然在应用程序中用于前端目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2017-01-11
    • 2012-08-19
    • 2019-11-15
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多