我有一个收藏的音乐列表,当我第一次打开该应用程序时,我会从音乐中检索该列表,该应用程序会从收藏夹中获取一个收藏的音乐列表。我想将此列表保存到共享
JSR 330: Dependency Injection For Java
音乐课在哪里:
preferences.List<Music> favoriteMusic = new List<Music>();
如何保存收藏的音乐列表?
答案 0 :(得分:18)
您应该执行以下步骤
保存对象:
- 使用
toMap()
方法将对象转换为地图- 使用
encode(...)
方法将地图编码为字符串- 将字符串保存为共享首选项
用于还原对象:
- 使用
decode(...)
方法将共享的首选项字符串解码为地图- 使用
fromJson()
方法获取对象
更新完整示例
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();
}
答案 1 :(得分:3)
Flutter 的 shared_preferences
插件有一个方法:setStringList(String key, List<String> value)
,所以你可以为你的对象编写序列化程序。
答案 2 :(得分:1)
将其转换为字符串,您可以存储它
import 'dart:convert';
...
var s = json.encode(myList);
// or var s = jsonEncode(myList);
json.decode() //convert a string to List when you load it
答案 3 :(得分:1)
对于像我这样想要更多了解我们亲爱的朋友 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() 相同
答案 4 :(得分:0)
首先,您可以将模型转换为字符串,然后可以将List<String>
保存在SharedPreferences
中。这是您应该如何做。
prefs.setStringList("key", yourList);
SharedPreferences prefs;
List<String> list;
// ...
Future<bool> _saveList() async {
return await prefs.setStringList("key", list);
}
List<String> _getList() {
return prefs.getStringList("key");
}
答案 5 :(得分:0)
只需在共享首选项中使用 stringlist
basic syntax:
// read
final myStringList = prefs.getStringList('my_string_list_key') ?? [];
// write
prefs.setStringList('my_string_list_key', ['a', 'b', 'c']);
首先将对象转换为地图。然后使用 jsonEncode 将地图转换为 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']);