【问题标题】:How do I encode List<Object> to save to prefs.setStringList in Flutter?如何编码 List<Object> 以保存到 Flutter 中的 prefs.setStringList?
【发布时间】:2021-04-26 09:08:09
【问题描述】:

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

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

【问题讨论】:

  • 这是 Music 对象编码/解码列表的一个很好的例子。您可以根据需要修改或从头开始创建。你有什么不清楚的地方?如果您提供更多详细信息,我会对您有所帮助。
  • 目前,Music.decode(encodedData) 生成一个有效的 JSON 数组。这不是你要找的吗?
  • 谢谢@blackkara。正如您所看到的,当我执行encode 时,它会生成一个字符串。我希望生成一个 List ,其最终目标是使用.setStringList 保存到首选项。我只是想不通如何更改此代码以适用于列表而不是仅适用于一个对象。
  • @Riwen,我正在寻找一个List&lt;String&gt;,以便保存在prefs.setStringList 中,然后在从首选项读取时能够解码回一个对象。
  • 为什么不将 JSON 数组保存为 setString 然后进行相应的解码?

标签: json flutter sharedpreferences decode encode


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 2015-03-22
    • 1970-01-01
    • 2016-07-31
    • 2022-09-30
    • 2020-10-20
    • 2021-01-17
    • 2011-10-18
    • 2022-11-10
    相关资源
    最近更新 更多