1
votes

AsyncStorage ne fonctionne pas sur Android, OK sous iOS

Sur iOS, tout fonctionne bien. Je n'ai que quelques éléments à ajouter et ce sont tous des chaînes de texte, mais j'utilise néanmoins JSON.stringify. Ceci est sur ma page de paramètres:

Dans le rendu, j'ai un commutateur:

 TypeError: undefined is not an object (evaluating "lang.a10")

qui exécute cette fonction:

  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);
   }
   }

qui exécute cette fonction:

 componentDidMount() {  // Listen for when the screen is focused
const { navigation } = this.props;
this.focusListener = navigation.addListener("didFocus", () => {
  this.getData();
});

}

Puis dans ma page / écran principal, j'ai:

  storeData = async (key, value) => {
try {
  await AsyncStorage.setItem(key, JSON.stringify(value));
}
catch(error) {
  console.log("You got this error: " + error);
}


0 commentaires

3 Réponses :


1
votes

Vous ne devez pas utiliser JSON.stringify si vous souhaitez uniquement enregistrer la chaîne. si vous souhaitez enregistrer un objet comme celui-ci, vous pouvez utiliser JSON.stringify

await AsyncStorage.getItem("language").then((value) =>{
       this.setState({selLang: value});
     });

Veuillez modifier ceci

await AsyncStorage.setItem(key,value);


0 commentaires

1
votes

Oui, je l'avais comme vous l'avez dit, mais je l'ai changé "juste au cas où".

Mais l'erreur était là sur Android de toute façon.

Je l'ai cependant compris. C'était ma faute, pas Android / AsyncStorage. J'appelais une fonction deux fois, en utilisant une touche différente. Donc, dans le componentDidMount, j'appelais deux fonctions, getData (key1) puis juste après getData (key2).

Pour une raison quelconque, lorsque la deuxième fonction s'est déclenchée, qui se trouvait être en utilisant la clé de langue, elle renvoyait "FRC" avec les guillemets, et pas seulement FRC. Mon écran recherchait donc un commutateur appelé switch "FRC" au lieu de switchFRC.

J'obtenais le résultat correct pour ma première fonction, mais pas pour la seconde. Bizarre. Pour remettre les choses en marche, je viens de créer une deuxième fonction, getDataB (key2) et maintenant tout fonctionne bien. Encore bizarre cependant que cela ait fonctionné sur iOS.

Merci pour votre aide, cela m'a permis d'écrire des tas de console.logs et finalement de les retrouver.


0 commentaires

1
votes

Après avoir ajusté certaines choses, le problème d'IOS fonctionne toujours correctement, mais sur Android, je reçois "null" d'AsyncStorage.

Ma fonction actuelle est:

 Running application on iPhone Xs.
 the value is: SWE
 It worked: SWE

 Running application on Android SDK built for x86.
 the value is: null


0 commentaires