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

3

我正在制作一个用于燃油费用跟踪的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<Entries> 并序列化每个条目来创建一个新的 List<String>,然后将该列表保存到 SharedPreferences 中,还是有更简单的方法?当我想从 SharedPreferences 中读取时,如何重新创建我的列表?
更新:当然,我还需要能够从列表中删除特定条目。
谢谢。

https://stackoverflow.com/questions/60192099/create-json-arrays-and-list-with-sharedpreferences/60237867#60237867 - Kahou
2个回答

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>中删除特定的项目,可以使用List classremove(entry)方法(如果可以传递该项),或者根据某个条件删除项目,例如使用removeWhere((entry) => entry.distance > 500)

希望这能帮助您。


当尝试执行json.decode(savedEntriesJson);时,这种方法会给我一个错误Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>' - vtomic85
你可以将 json.decode(savedEntriesJson) 的结果强制转换为 List<Map<String, dynamic>> 或者 entriesDeserialized 的类型为 List<dynamic>。我会更新答案并回复你的其他问题。 - Ayman Barghout

0

如果要添加entry,您不需要序列化所有的条目,只需使用SharedPreferencesgetStringList方法,并将您的entryjson字符串添加到字符串列表中,然后再次保存即可。

  var sharedPreferences = await SharedPreferences.getInstance();
  List<String> entriesStr = sharedPreferences.getStringList(KEY);
  entriesStr.add(jsonEncode(entryToAdd.toJson()));
  sharedPreferences.setStringList(KEY, entriesStr);

也许对你来说,一个选项是将所有条目都放在 entry_prefix 中,如果你需要所有的 entries,那么你可以使用 getKeys() 方法,并过滤所有 entries 的键。 - Alexey Filippov
只是一个额外的问题 - 我该如何从列表中间删除特定条目并保存新状态?我还将更新原始问题。 - vtomic85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接