如何在 Flutter 中将 List<Object> 保存到 SharedPreferences?

sum*_*lut 29 sharedpreferences flutter

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

preferences.List<Music> favoriteMusic = new List<Music>();
Run Code Online (Sandbox Code Playgroud)

音乐课在哪里:

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,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

如何保存最喜欢的音乐列表?

Ham*_*med 43

你应该做这些步骤

保存对象:

  1. 使用toMap()方法将对象转换为映射
  2. 使用encode(...)方法将您的地图编码为字符串
  3. 将字符串保存到共享首选项

用于恢复您的对象:

  1. 使用decode(...)方法将共享首选项字符串解码为映射
  2. 使用fromJson()方法来获取您的对象

更新完整示例

import 'dart:convert';

void main() async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  
  // Encode and store data in SharedPreferences
  final String encodedData = Music.encode([
    Music(id: 1, ...),
    Music(id: 2, ...),
    Music(id: 3, ...),
  ]);

  await prefs.setString('musics_key', encodedData);

  // Fetch and decode data
  final String musicsString = await prefs.getString('musics_key');

  final List<Music> musics = Music.decode(musicsString);
}

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上解决了我保存对象列表的问题,但是它仅在该对象具有原始数据类型作为其变量时才有效。就我而言,MyObject 有一个 List&lt;String&gt; 作为变量。有什么解决办法吗?谢谢 (2认同)

Mic*_*ski 9

Flutter 的shared_preferences插件有一个方法:setStringList(String key, List<String> value),所以你可以为你的对象编写序列化器。


Rud*_*wal 5

将其转换为字符串,即可存储

import 'dart:convert';
...
var s = json.encode(myList);
// or var s = jsonEncode(myList);

json.decode() //convert a string to List when you load it
Run Code Online (Sandbox Code Playgroud)