如何使用SharedPreferences保存和检索自定义对象的列表?

时间:2020-02-21 12:08:48

标签: flutter dart sharedpreferences

我正在制作Flutter应用来跟踪燃料费用。我有一个简单的对象:

class Entry {
  double _fuel;
  double _money;
  double _distance;

  Entry(this._fuel, this._money, this.distance);

  Entry.fromJson(Map<String, dynamic> json) => Entry (json['fuel'], json['money'], json['distance']);

  Map<String, dynamic> toJson() => {'fuel':_fuel, 'money':_money, 'distance':_distance};
}

每当我加满油箱时,我都想输入一个新条目,并永久保留所有这些条目。在应用程序中,我有一个List<Entry> entries,但找不到将列表保存在SharedPreferences中的方法。只有一种方法可以接受字符串列表。我应该通过遍历List<String>并序列化每个条目,然后将该列表保存到List<Entries>来创建一个新的SharedPreferences还是有更简单的方法?当我想阅读SharedPreferences时,如何重新创建列表?

更新:当然,我还需要能够从列表中删除特定条目。

谢谢。

2 个答案:

答案 0 :(得分:6)

  • 将它们另存为List<String>确实是一个可行的选择,我可以想到的另一个选择是使用json.encode()方法将整个列表序列化为json并将其另存为SharedPreferences中的字符串,然后检索并反序列化它们,然后对其进行迭代以再次将它们变成您的自定义对象。
SharedPreferences prefs = await SharedPreferences.getInstance();
List<Entry> entries = // insert your objects here ;
final String entriesJson = json.encode(entries.map((entry) => entry.toJson()).toList());
prefs.setString('entries', entriesJson);
final String savedEntriesJson = prefs.getString('entries);
final List<dynamic> entriesDeserialized = json.decode(savedEntriesJson);
List<Entry> deserializedEntries = entriesDeserialized.map((json) => Entry.fromJson(json)).toList();
  • 要从SharedPreferences中删除特定键(及其值),只需使用remove(key)方法,或者如果您要使用相同的键,则可以将键设置为新值,将覆盖先前的值。

  • 要从List<Entry>中删除特定项目,可以通过remove(entry)的{​​{1}}方法(如果可以通过),也可以根据需要删除某项目特定条件,例如使用List class

希望有帮助。

答案 1 :(得分:0)

要添加entry,您无需序列化所有条目,只需使用getStringList的{​​{1}}并将SharedPreferences的{​​{1}}添加到字符串列表,并再次保存

json string