Flutter 如何保存列表<;对象>;分享参考资料?

Flutter 如何保存列表<;对象>;分享参考资料?,flutter,sharedpreferences,Flutter,Sharedpreferences,我有一个最喜欢的音乐列表,当应用程序第一次打开时,我从音乐中检索到它,应用程序从favorite中获取最喜欢的音乐列表。我想将此列表保存到共享 preferences.List<Music> favoriteMusic = new List<Music>(); preferences.List-favoriteMusic=new-List(); 音乐课在哪里: class Music { final int id; final String name, siz

我有一个最喜欢的音乐列表,当应用程序第一次打开时,我从音乐中检索到它,应用程序从favorite中获取最喜欢的音乐列表。我想将此列表保存到共享

preferences.List<Music> favoriteMusic = new List<Music>();
preferences.List-favoriteMusic=new-List();
音乐课在哪里:

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,
    );
  }
}
课堂音乐{
最终int id;
最终字符串名称、大小、评级、持续时间、img;
布尔最爱;
音乐({
这个身份证,
这个.评级,,
这个尺寸,
这个时间,,
这个名字,
这个.img,,
这是我最喜欢的,
});
factory Music.fromJson(映射jsonData){
回音(
id:jsonData['id'],
评级:jsonData[“评级”],
大小:jsonData['size'],
持续时间:jsonData['duration'],
名称:jsonData['name'],
img:jsonData['img'],
最喜欢的:假,
);
}
}

如何保存喜爱的音乐列表?

您应该执行以下步骤

要保存对象,请执行以下操作:

  • 使用
    toMap()
    方法将对象转换为贴图
  • 使用
    encode(…)
    方法将地图编码为字符串
  • 将字符串保存到共享首选项
  • 要还原对象,请执行以下操作:

  • 使用
    decode(…)
    方法将共享首选项字符串解码到映射
  • 使用
    fromJson()
    方法获取对象

  • 更新完整样本

    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();
    }
    
    导入'dart:convert';
    void main(){
    最终字符串encodedData=Music.encode([
    音乐(id:1,…),
    音乐(id:2,…),
    音乐(id:3,…),
    ]);
    最终列表decodedata=Music.decode(encodedData);
    打印(解码数据);
    }
    课堂音乐{
    最终int id;
    最终字符串名称、大小、评级、持续时间、img;
    布尔最爱;
    音乐({
    这个身份证,
    这个.评级,,
    这个尺寸,
    这个时间,,
    这个名字,
    这个.img,,
    这是我最喜欢的,
    });
    factory Music.fromJson(映射jsonData){
    回音(
    id:jsonData['id'],
    评级:jsonData[“评级”],
    大小:jsonData['size'],
    持续时间:jsonData['duration'],
    名称:jsonData['name'],
    img:jsonData['img'],
    最喜欢的:假,
    );
    }
    静态映射图(音乐)=>{
    “id”:music.id,
    “评级”:音乐。评级,
    “大小”:music.size,
    “持续时间”:music.duration,
    “name”:music.name,
    “img”:music.img,
    “收藏”:音乐。收藏,
    };
    静态字符串编码(列表音乐)=>json.encode(
    音乐
    .map((音乐)=>music.toMap(音乐))
    .toList(),
    );
    静态列表解码(字符串音乐)=>
    (json.decode(music)作为列表)
    .map((项)=>Music.fromJson(项))
    .toList();
    }
    
    将其转换为字符串,您可以存储它

    import 'dart:convert';
    ...
    var s = json.encode(myList);
    // or var s = jsonEncode(myList);
    
    json.decode() //convert a string to List when you load it
    

    对于像我这样的noob人来说,如果他们想更多地了解我们亲爱的朋友Hamed在他的回答中所做的魔术,或者想让他的解决方案适应更复杂的列表类/其他类,请查看以下两个链接:


    JSONECODE()和jsonDecode()与json.encode()和json.decode()相同。

    FLATTER的
    共享首选项
    插件有一个方法:
    setStringList(字符串键,列表值)
    ,所以你可以为你的对象编写序列化程序。

    你可以在保存中序列化你的对象,在检索时反序列化它。@Hamed Sorry,但是你能帮我进行序列化吗?我对颤振还不熟悉,对此有一些问题吗?我添加了一个答案。这个方法只适用于1个对象吗?你可以轻松地将它扩展为一个对象列表。你只需要创建一个映射列表。我非常爱你brooo:))这实际上解决了我保存对象列表的问题,但是它只在对象的原始数据类型作为其变量时起作用。在我的例子中,MyObject中有一个列表作为变量。有解决办法吗?谢谢你,兄弟!!