Reputation: 678
I have a list of favorite music, which I retrieve from music when the app is opened for the first time, the app gets a favorite music list from favorite. I want to save this list to shared
preferences.List<Music> favoriteMusic = new List<Music>();
where music class is:
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,
);
}
}
How can I save favorite music list?
Upvotes: 49
Views: 75450
Reputation: 1493
Here the solution for store and retrieve some list of object data to shared preference from api response
Here the sampleData carrying whole data from api and sampleList is the list to store shared preference
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);
Here the reverse that shared preference string data to object list model
// 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);
Upvotes: 1
Reputation: 679
simply use stringlist in shared preferences
basic syntax:
// read
final myStringList = prefs.getStringList('my_string_list_key') ?? [];
// write
prefs.setStringList('my_string_list_key', ['a', 'b', 'c']);
Firstly convert the object to a map. Then convert the map to a JSON string using jsonEncode
and at the end save the JSON string to shared preferences
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);
retrieve data
final rawJson = prefs.getString('my_string_key') ?? '';
Map<String, dynamic> map = jsonDecode(rawJson);
final person = Person(map['name'], map['age']);
Upvotes: 5
Reputation: 7222
You should do these steps
to save the object:
- convert your object to map with
toMap()
method- encode your map to string with
encode(...)
method- save the string to shared preferences
for restoring your object:
- decode shared preference string to a map with
decode(...)
method- use
fromJson()
method to get your object
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();
}
Upvotes: 98
Reputation: 2000
Flutter's shared_preferences
plugin has a method: setStringList(String key, List<String> value)
, so you can just write serializer for your objects.
Upvotes: 10
Reputation: 351
For noob folks like me who want to understand a bit more about the magic our dear friend Hamed did in his answer, or want to adapt his solution to more complex classes with lists/other classes, check out these two links: https://bezkoder.com/dart-flutter-parse-json-string-array-to-object-list/
https://bezkoder.com/dart-flutter-convert-object-to-json-string/
jsonEncode() and jsonDecode() are the same as json.encode() and json.decode()
Upvotes: 3
Reputation: 3100
Convert it to a string, you can store it
import 'dart:convert';
...
var s = json.encode(myList);
// or var s = jsonEncode(myList);
json.decode() //convert a string to List when you load it
Upvotes: 6