11
votes

Comment enregistrer la liste <Objet> dans le flutter de SharedPreferences?

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 commentaires

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.


3 Réponses :


0
votes

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


2 commentaires

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 ).



15
votes

Vous devriez suivre ces étapes

pour enregistrer l'objet:

  1. convertir votre objet en carte avec la méthode toMap()
  2. encodez votre carte en chaîne avec la méthode encode(...)
  3. enregistrer la chaîne dans les préférences partagées

pour restaurer votre objet:

  1. décoder la chaîne de préférence partagée en une carte avec la méthode decode(...)
  2. 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();
}


4 commentaires

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



1
votes

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


0 commentaires