如何在 Flutter 中对 List<Object> 进行编码以保存到 prefs.setStringList?

问题描述

我发现 here 的这个问题对我有用,用于将对象编码为字符串以保存到首选项,但是我将如何将此代码转换为对 List 进行编码对象?

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

有人评论说您只需要创建一个地图列表,但我无法理解这意味着什么。请告诉我使用此代码

解决方法

setStringList 和 setString 都可以存储对象列表。但对我来说,第二个,编码整个列表一次更好

使用 setStringList

var encodedMusic1 = json.encode(Music(id: 1,...).toMap());
var encodedMusic2 = json.encode(Music(id: 2,...).toMap());
List<String> list = [encodedMusic1,encodedMusic2];

prefs.setStringList('key',list);

使用 setString

var encodedListOfMusic = Music.encode([Music(id: 1,...),Music(id: 2,]);

prefs.setString('key',encodedListOfMusic);