AsyncStorage 在 react-native-web 上工作,在 ios 上失败(字符串化 json 数据)

AsyncStorage works on react-native-web, fails on ios (stringified json data)

我有一个 web/ios react-native 项目。在网络上这没有任何问题,但在 iOS 上我收到错误。奇怪的是,我在调试window中完全没有看到错误,只好靠红屏了。

我保存数据的方式是这样的:

console.log(`user progress: writing string of >>${JSON.stringify(user.progress)}<< original's type: '${typeof user.progress}'`)
await AsyncStorage.setItem(
    appConfig.constants.graphcool.progress,
    user.progress
)

那个日志是我在调试器中看到的最后一个日志:

用户进度:写入字符串 >>{"VocabularyPairs":{"1":0.984375,"2":0.996875,"3":0.875}<< 原始类型:'object'

我在 iOS 中遇到错误的红屏:

Exception '-[NSDictionaryM length]: unrecognized selector sent to instance 0x2832c5ce0' was thrown while invoking multiSet on target AsyncLocalStorage with params (
    (
        (
      progress,
            {
        VocabularyPairs =        {
          1 = "0.984375";
          2 = "0.996875";
          3 = "0.875";
        };
      }
    )
  ),
  311
)

所以 -- 我可以通过更改代码来解决此问题:

await AsyncStorage.setItem(
    appConfig.constants.graphcool.progress,
    Platform.OS === 'ios' ? JSON.stringify(user.progress): user.progress
)

但我的问题是,为什么我必须这样做?如果我确实修复了它,还有另外两个地方也设置了相同的项目——一个已经有了那个包装,另一个没有。 两个地方都有效,而且总是几乎相同数据——数字(即值)可能会改变,但它们在任何地方都是字符串键和数字值。

第一次写有什么特别之处?

如果您使用 AsyncStorage.setItem,值应该是 字符串 。 传递对象而不是字符串应该不起作用!

  AsyncStorage.setItem(key: string, value: string, [callback]: ?(error: ?Error) => void)

REFERE DOCS HERE