как сохранить и прочитать список объектов класса, используя общие настройки в Flutter dart?

#flutter #dart #sharedpreferences

#flutter #dart #sharedpreferences

Вопрос:

у меня есть следующий класс :

 class Payment {
      String date;
      String time;
      String code;
      String toPay;
      String payed;
      String left;
      Payment({ this.date, this.code, this.toPay, this.payed, this.left, this.time });
    }
  

в моем приложении Flutter я должен сохранять и читать список payments использования shared preferences и использовать date атрибут в качестве key

 _ReadPayment(String date) async {
  final prefs = await SharedPreferences.getInstance();
  final key = date;
    // here how i get the list of payment like getPaymentList instead of getStringList
  final value = prefs.getStringList(key) ?? null;
}

_SavePayment(String date, List<Payment> list) async {
  final prefs = await SharedPreferences.getInstance();
  final key = date;
  // here how i set Payment list instead of setStringList
  prefs.setStringList(key,list);
}
  

Ответ №1:

Поскольку метод setListString из SharedPreference принимает список строк.

ЧТОБЫ СОХРАНИТЬ

  1. Создайте метод toMap() в своем Payment классе, который преобразует Payment объект в Map .
 class Payment {
  String date;
  String time;
  String code;
  String toPay;
  String payed;
  String left;
  Payment({
    this.date,
    this.code,
    this.toPay,
    this.payed,
    this.left,
    this.time,
  });

  // method to convert Payment to a Map
  Map<String, dynamic> toMap() => {
    'date': date,
    'time': time,
    ....// do the rest for other members
  };
}

  
  1. Преобразуйте ваш Payment экземпляр в Map<String, dynamic>
  // payment instance 
 Payment payment = Payment();
 // convert the payment instance to a Map
 Map<String, dynamic> mapObject = payment.toMap();
  
  1. Закодируйте значение `Map<String, dynamic>, полученное на шаге 1
  // encode the Map which gives a String as a result
 String jsonObjectString = jsonEncode(mapObject);
  
  1. Закодированный результат — это a, String который вы можете добавить к a, List который может быть передан SharedPreference setListString методу.
   // list to store the payment objects as Strings
  List<String> paymentStringList = [];
  // add the value to your List<String>
   paymentStringList.add(jsonObjectString);
  

ДЛЯ ЧТЕНИЯ

1. Создайте конструктор фабрики fromMap() в вашем Payment классе, который преобразует Map в Payment объект.

 class Payment {
  String date;
  String time;
  String code;
  String toPay;
  String payed;
  String left;
  Payment({
    this.date,
    this.code,
    this.toPay,
    this.payed,
    this.left,
    this.time,
  });

  // factory constructor to convert Map to a Payment
  factory Payment.fromMap(Map<String, dynamic> map) => Payment(
      date: map['date'],
      time: map['time'],
      .... // other members here
    );

  
  1. Получить Json String из List
  // get the json string from the List
 String jsonObjectString = paymentStringList[2]; // using index 2 as an example
  
  1. Преобразуйте Json String в Map , расшифровав его
  // convert the json string gotten to a Map object
 Map mapObject = jsonDecode(jsonObjectString);
  
  1. Используйте fromMap конструктор вашего Payment класса для преобразования Map в Payment объект
   // use the fromMap constructor to convert the Map to a Payment object
  Payment payment = Payment.fromMap(mapObject);
  // print the members of the payment class
  print(payment.time);
  print(payment.date);
  

Комментарии:

1. большое спасибо, похоже на то, что мне нужно, я попробую и расскажу вам

Ответ №2:

Общие настройки не поддерживают сохранение объекта Dart напрямую. Что вы можете сделать, это сериализовать ваш объект ( платеж) в строку json (мы называем эту карту в dart), а затем сохранить ее как строку.

Затем, когда вы его прочитаете, вы просто десериализуете его.

Вы можете добиться этого с помощью библиотеки, которую я рекомендую Json serializer, но вы также можете легко сделать это вручную.

Попробуйте и дайте мне знать, как это происходит в комментарии.