J'ai une liste de musiques préférées, que je récupère à partir de la musique lorsque l'application est ouverte pour la première fois, l'application obtient une liste de musique préférée à partir des favoris. Je souhaite enregistrer cette liste pour la partager
class Music {
final int id;
final String name, size, rating, duration, img;
bool favorite;
Music({
this.id,
this.rating,
this.size,
this.duration,
this.name,
this.img,
this.favorite,
});
factory Music.fromJson(Map<String, dynamic> jsonData){
return Music(
id: jsonData['id'],
rating: jsonData['rating'],
size: jsonData['size'],
duration: jsonData['duration'],
name: jsonData['name'],
img: jsonData['img'],
favorite: false,
);
}
}
où la classe de musique est:
preferences.List<Music> favoriteMusic = new List<Music>();
Comment puis-je enregistrer la liste de musique préférée?
3 Réponses :
Tout d'abord, vous pouvez convertir votre modèle en chaîne, puis enregistrer la List<String> dans SharedPreferences . Voici comment procéder.
SharedPreferences prefs;
List<String> list;
// ...
Future<bool> _saveList() async {
return await prefs.setStringList("key", list);
}
List<String> _getList() {
return prefs.getStringList("key");
}
prefs.setStringList("key", yourList);
Oui, je sais mais j'ai besoin de la liste <object> pour les données de sortie de la liste sur le widget.
@sumseflut Vous ne pouvez pas stocker directement votre List<object> dans les sharedPreferences . Vous devez convertir votre modèle mappé en chaîne JSON, puis le stocker dans sharedPreferences . Pendant que vous obtenez la liste de sharedPreferences cette chaîne JSON à vos objets de modèle en utilisant [JSON et sérialisation] ( flutter.dev/docs/development/data-and-backend/json ).
Vous devriez suivre ces étapes
pour enregistrer l'objet:
- convertir votre objet en carte avec la méthode
toMap()- encodez votre carte en chaîne avec la méthode
encode(...)- enregistrer la chaîne dans les préférences partagées
pour restaurer votre objet:
- décoder la chaîne de préférence partagée en une carte avec la méthode
decode(...)- utilisez la méthode
fromJson()pour obtenir votre objet
METTRE À JOUR L'ÉCHANTILLON COMPLET
import 'dart:convert';
void main() {
final String encodedData = Music.encode([
Music(id: 1, ...),
Music(id: 2, ...),
Music(id: 3, ...),
]);
final List<Music> decodedData = Music.decode(encodedData);
print(decodedData);
}
class Music {
final int id;
final String name, size, rating, duration, img;
bool favorite;
Music({
this.id,
this.rating,
this.size,
this.duration,
this.name,
this.img,
this.favorite,
});
factory Music.fromJson(Map<String, dynamic> jsonData) {
return Music(
id: jsonData['id'],
rating: jsonData['rating'],
size: jsonData['size'],
duration: jsonData['duration'],
name: jsonData['name'],
img: jsonData['img'],
favorite: false,
);
}
static Map<String, dynamic> toMap(Music music) => {
'id': music.id,
'rating': music.rating,
'size': music.size,
'duration': music.duration,
'name': music.name,
'img': music.img,
'favorite': music.favorite,
};
static String encode(List<Music> musics) => json.encode(
musics
.map<Map<String, dynamic>>((music) => Music.toMap(music))
.toList(),
);
static List<Music> decode(String musics) =>
(json.decode(musics) as List<dynamic>)
.map<Music>((item) => Music.fromJson(item))
.toList();
}
est cette méthode uniquement pour 1 objet?
vous pouvez facilement le développer pour une liste d'objets. il vous suffit de créer une liste de cartes.
Je t'aime tellement brooo :)))
cela a en fait résolu mon problème pour enregistrer la liste d'objets, mais cela ne fonctionne que si cet objet a un type de données primitif comme variables. Dans mon cas, MyObject contient une List <String> en tant que variable. Toute solution? Merci
Convertissez-le en chaîne, vous pouvez le stocker
import 'dart:convert'; ... var s = json.encode(myList); // or var s = jsonEncode(myList); json.decode() //convert a string to List when you load it
vous pouvez sérialiser votre objet lors de la sauvegarde et le désérialiser à la récupération.
@Hamed Sorrry, mais pouvez-vous m'aider avec la sérialisation, je suis nouveau dans le flutter et j'ai un problème avec ça?
J'ai ajouté une réponse.