如何将 List 保存到 Flutter 中的 SharedPreferences

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

preferences.List<Music> favoriteMusic = new List<Music>();

其中音乐课是:

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

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

推荐答案

您应该执行以下步骤

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

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

要恢复您的对象,请执行以下操作:

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

UPDATE FULL SAMPLE

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

Flutter相关问答推荐

如何从外部控制有状态窗口小部件本身?

在Flutter 动中绘制ECG图

无法在我的Flutter 应用程序中使用GoRouter测试导航

自定义类提供程序 Riverpod Flutter 中的可变变量

Select 文本时如何更改 Flutter 中的光标 colored颜色 ?

无状态小部件被奇怪地重建

MediaQuery 在不同手机上不一致

这是使用导航功能处理从一页到另一页的移动的最佳方式

如何为文本主题设置多种 colored颜色 ?

Flutter/Dart - 从外部类更新状态

如何在两个不同的路由(屏幕)之间正确设置 BlocProvider?

在 Dart 中使用隔离时访问外部范围内的变量

如何将 void 函数放入单独的 dart 文件的单独页面中

为什么 setState 不改变我的变量 Flutter?

无法将参数类型Future Function(String?)分配给参数类型void Function(NotificationResponse)?

Future.wait() 中的 futures 可以顺序调用吗?

Firebase Cloud Messaging (Flutter):订阅主题时出现错误消息

Flutter:font_awesome_icon pro 版报错?如何设置 font_awesome 克隆仓库的路径?

Flutter 用户过滤器

Flutter 在滚动期间保持某些元素固定?