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



我有一个最喜欢的音乐列表,当应用程序第一次打开时,我会从音乐中检索,应用程序会从收藏夹中获得一个最喜爱的音乐列表。我想将此列表保存到共享

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()方法将对象转换为映射
  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();
}

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

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

import 'dart:convert';
...
var s = json.encode(myList);
// or var s = jsonEncode(myList);
json.decode() //convert a string to List when you load it

对于像我这样的noob用户,如果他们想更多地了解我们亲爱的朋友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((相同

只需在共享首选项中使用字符串列表

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

这里是从api响应中存储和检索共享偏好的一些对象数据列表的解决方案

这里的sampleData携带了来自api和sampleList的全部数据,是存储共享偏好的列表

SampleModel sampleData = await ApiCall();
List<SampleDataItem> sampleList = sampleData.sampleList;
//Convert sampleList to string
String sampleStringList = jsonEncode(sampleList);

print(sampleStringList);
// Store to preference as string 
PreferenceUtils.setSampleListData(sampleStringList);

这里的反向,共享首选字符串数据到对象列表模型

// get data from preference
String sampleDataFromPref = PreferenceUtils.getSampleListData();
// convert string data to jsonMap
var sampleJsonMap = json.decode(sampleDataFromPref);
// convert json map list to object model lis
List<SampleDataItem> sampleListFromPreferance = List<SampleDataItem>.from(jsonMap.map((x) => SampleDataItem.fromJson(x)));
// print the final output
print(sampleListFromPreferance);

最新更新