Иногда появляется необходимость сохранять значения не только примитивных типов, но и целые объекты.
Подготовка класса
Имеется некоторый класс CounterInfo с набором свойств value типа int, lastUpdate типа DateTime и userName типа String.
class CounterInfo {
int value;
DateTime lastUpdate;
String userName;
CounterInfo({
required this.value,
required this.lastUpdate,
required this.userName,
});
}
Для того чтобы сохранить объект данного типа в локальное хранилище необходимо в данный класс добавить метод toJson(), который будет возвращать Map<String, dynamic>. Ключами в данном словаре будут названия свойств типа, а значениями, соответственно, значения хранящиеся в свойствах объекта.
Map<String, dynamic> toJson() => {
'value': value,
'lastUpdate': lastUpdate.toIso8601String(),
'userName': userName,
};
Далее необходимо создать именованный конструктор fromJson(). C его помощью из Map<String, dynamic> будет создаваться экземпляр класса CounterInfo.
CounterInfo.fromJson(Map<String, dynamic> json)
: value = json['value'],
lastUpdate = DateTime.parse(json['lastUpdate']),
userName = json['userName'];
В итоге класс CounterInfo будет выглядеть следующим образом:
class CounterInfo {
int value;
DateTime lastUpdate;
String userName;
CounterInfo({
required this.value,
required this.lastUpdate,
required this.userName,
});
CounterInfo.fromJson(Map<String, dynamic> json)
: value = json['value'],
lastUpdate = DateTime.parse(json['lastUpdate']),
userName = json['userName'];
Map<String, dynamic> toJson() => {
'value': value,
'lastUpdate': lastUpdate.toIso8601String(),
'userName': userName,
};
}
Использование пакета shared_preferences
Для сохранения экземпляра класса CounterInfo используется json.encode(), который позволяет конвертировать объект в JSON строку. После этого результат выполнения json.encode() можно сохранить, используя метод SharedPreferences setString():
Future _setCounterInfo() async {
var prefs = await SharedPreferences.getInstance();
final counterInfo = CounterInfo(
value: _counter,
lastUpdate: DateTime.now(),
userName: 'Alex',
);
prefs.setString(counterInfoKey, json.encode(counterInfo));
}
Для получения объекта необходимо воспользоваться методом SharedPreferences getString() и полученный результат передать методу json.decode(), чтобы из JSON строки получить JSON объект. Далее, данный объект передается в именованный конструктор fromJson() и на выходе получается новый объект типа CounterInfo:
Future<CounterInfo?> _getCounterInfo() async {
var prefs = await SharedPreferences.getInstance();
final counterInfo = prefs.getString(counterInfoKey);
if (counterInfo == null) return null;
return CounterInfo.fromJson(json.decode(counterInfo));
}
Полезные ссылки:
Как использовать shared preferences
Как сохранять DateTime используя shared preferences
Телеграм: https://t.me/the_cybermania
Исходный код: https://github.com/AlexeyShpavda/shared_preferences_objects
Видео: https://www.youtube.com/watch?v=HKwzU6Owxjs