dart 如何在Flutter中将列表保存< Object>到共享首选项?

jqjz2hbq  于 2023-03-15  发布在  Flutter
关注(0)|答案(5)|浏览(147)

我有一个最喜欢的音乐列表,我在首次打开应用程序时从音乐中检索该列表,应用程序从“收藏夹”中获取最喜欢的音乐列表。我想将此列表保存到共享

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

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

jjhzyzn0

jjhzyzn01#

您应该执行以下步骤
要保存对象:
1.用toMap()方法将对象转换为Map
1.使用encode(...)方法将Map编码为字符串
1.保存字符串到共享的首选项
用于还原对象:
1.使用decode(...)方法将共享偏好字符串解码为Map
1.使用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();
}
eanckbw9

eanckbw92#

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

pkwftd7m

pkwftd7m3#

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

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

json.decode() //convert a string to List when you load it
nbysray5

nbysray54#

对于像我这样的新手来说,如果你想更多地了解我们亲爱的朋友Hamed在他的答案中所做的神奇之处,或者想让他的解决方案适用于更复杂的列表类/其他类,请查看以下两个链接:https://bezkoder.com/dart-flutter-parse-json-string-array-to-object-list/
https://bezkoder.com/dart-flutter-convert-object-to-json-string/
jsonEncode()和jsonDecode()与json.encode()和json.decode()相同

oewdyzsn

oewdyzsn5#

只需在共享首选项中使用stringlist

basic syntax:

    // read
    final myStringList = prefs.getStringList('my_string_list_key') ?? [];
    // write
    prefs.setStringList('my_string_list_key', ['a', 'b', 'c']);

首先将对象转换为Map,然后使用jsonEncode将Map转换为JSON字符串,最后将JSON字符串保存到共享首选项中

Sample example:

        // import 'dart:convert';
    Person person = Person('Mary', 30);
    Map<String, dynamic> map = {
      'name': person.name,
      'age': person.age
    };
    String rawJson = jsonEncode(map);
    prefs.setString('my_string_key', rawJson);

检索数据

final rawJson = prefs.getString('my_string_key') ?? '';
Map<String, dynamic> map = jsonDecode(rawJson);
final person = Person(map['name'], map['age']);

相关问题