Как сохранять и получать объекты, используя Flutter Shared Preferences

Как сохранять и получать объекты, используя Flutter Shared Preferences

Иногда появляется необходимость сохранять значения не только примитивных типов, но и целые объекты.

Подготовка класса

Имеется некоторый класс 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

Read More