【问题标题】:How to save and retrieve a list of custom objects with SharedPreferences?如何使用 SharedPreferences 保存和检索自定义对象列表?
【发布时间】:2020-02-21 12:08:48
【问题描述】:

我正在制作一个用于跟踪燃料费用的 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&lt;Entry&gt; entries,但我找不到将该列表保存在SharedPreferences 中的方法。只有一种方法接受字符串列表。我应该通过迭代我的List&lt;Entries&gt; 并序列化每个条目,然后将该列表保存到SharedPreferences 来创建一个新的List&lt;String&gt;,还是有更简单的方法?当我想阅读SharedPreferences 的内容时,如何重新创建我的列表?

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

谢谢。

【问题讨论】:

标签: flutter dart sharedpreferences


【解决方案1】:
  • 将它们保存为List&lt;String&gt; 确实是一个可行的选择,我能想到的另一个选择是使用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();
    1234563之前的值。
  • 要从List&lt;Entry&gt; 中删除特定项目,如果可以传递项目,可以使用List classremove(entry) 方法,或者根据特定条件使用@987654328 删除项目@例如。

希望有所帮助。

【讨论】:

  • 这种方法在尝试执行 json.decode(savedEntriesJson); 时给了我一个错误 Unhandled Exception: type 'List&lt;dynamic&gt;' is not a subtype of type 'List&lt;Map&lt;String, dynamic&gt;&gt;'
  • 你可以转换json.decode(savedEntriesJson)as List&lt;Map&lt;String, dynamic&gt;&gt;的结果或者entryDeserializedList&lt;dynamic&gt;的类型..我会用那个位更新答案并回复你的其他问题。
【解决方案2】:

要添加entry,您不需要序列化所有条目,只需使用SharedPreferencesgetStringList 并将entryjson string 添加到字符串列表中,然后再次保存

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

【讨论】:

  • 也许你的一个选项只是把你所有的条目都放在entry_prefix,如果你需要你所有的entries,那么你可以使用getKeys()方法和你所有@987654329的过滤键之后@
  • 只是一个额外的问题 - 我将如何从列表中间的某处删除特定条目并保存新状态?我也会更新原来的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2016-10-25
  • 1970-01-01
  • 2013-02-05
  • 2015-04-02
  • 2020-09-13
  • 2017-12-28
相关资源
最近更新 更多