#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
принимает список строк.
ЧТОБЫ СОХРАНИТЬ
- Создайте метод
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
};
}
- Преобразуйте ваш
Payment
экземпляр вMap<String, dynamic>
// payment instance
Payment payment = Payment();
// convert the payment instance to a Map
Map<String, dynamic> mapObject = payment.toMap();
- Закодируйте значение `Map<String, dynamic>, полученное на шаге 1
// encode the Map which gives a String as a result
String jsonObjectString = jsonEncode(mapObject);
- Закодированный результат — это 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
);
- Получить
Json String
изList
// get the json string from the List
String jsonObjectString = paymentStringList[2]; // using index 2 as an example
- Преобразуйте
Json String
вMap
, расшифровав его
// convert the json string gotten to a Map object
Map mapObject = jsonDecode(jsonObjectString);
- Используйте
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, но вы также можете легко сделать это вручную.
Попробуйте и дайте мне знать, как это происходит в комментарии.