在 iOS 上,一切正常。我只有几个项目要添加,它们都是文本字符串,但即便如此我还是使用 JSON.stringify。这是在我的设置页面上:
在渲染中我有一个开关:
<Switch
onValueChange = {(languageObject, switchID) => this.toggleLang("ENG", "switchENG")}
value = {this.state.switchENG}/>
运行这个函数:
toggleLang = (language, switchID) => {
const myStates = ["switchENG", "switchFRC", "switchSPN"];
for(let i = 0; i < myStates.length; i++) {
if(myStates[i] === switchID) {
this.setState({[myStates[i]]: true});
} else {
this.setState({[myStates[i]]: false});
}
};
this.storeData("language", language);
}
运行这个函数:
storeData = async (key, value) => {
try {
await AsyncStorage.setItem(key, JSON.stringify(value));
}
catch(error) {
console.log("You got this error: " + error);
}
然后在我的主页/屏幕中,我有:
componentDidMount() { // Listen for when the screen is focused
const { navigation } = this.props;
this.focusListener = navigation.addListener("didFocus", () => {
this.getData();
});
运行这个函数:
getData = async () => {
try { // get the language (ENG/FRC/SPN etc)
await AsyncStorage.getItem("language").then((value) =>{
this.setState({selLang: value});
});
}
catch(error) {
alert("You got this error: " + error);
}
}
我将我的屏幕临时设置为不使用 AsyncStorage 进行渲染,只是为了测试目的,一个函数绑定(bind)到开关,当切换时,调用该函数来获取语言项并将标签的文本项更改为新语言.
正如我所说,在 iOS 上一切正常,我可以在语言之间切换,并且在我重新加载应用程序时所有这些都会保留。
我正在使用博览会。在终端我得到: react native --v react native cli:2.0.1 react native :0.59.8
当我在 Android 中切换开关时,我得到:
TypeError: undefined is not an object (evaluating "lang.a10")
这似乎表明它没有从 AsyncStorage 收到任何东西。
我真的希望我的应用程序在离线时运行,所以服务器商店不是我想要的。 AsyncStorage 是完美的。但它不适用于 Android。
最佳答案
如果您只想保存字符串,则不应使用 JSON.stringify。如果你想像这样保存对象,那么你可以使用 JSON.stringify
let value = {
age: 31,
traits: {eyes: 'blue', shoe_size: 10},
};
await AsyncStorage.setItem(key, JSON.stringify(value));
请更改此
await AsyncStorage.setItem(key, JSON.stringify(value));
到
await AsyncStorage.setItem(key,value);
所以当你收到它时,它会给你字符串而不是这些行中的对象
await AsyncStorage.getItem("language").then((value) =>{
this.setState({selLang: value});
});
关于android - AsyncStorage 不适用于 Android,在 iOS 中正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837858/