【问题标题】:How can I store and safe a List of Maps in Flutter using Shared Preferences? (Flutter, SharedPreferences)如何使用共享首选项在 Flutter 中存储和保护地图列表? (颤振,共享首选项)
【发布时间】:2021-08-16 03:01:39
【问题描述】:

我正在尝试在我的 Flutter 应用中保护和加载对话。 为此,我将每条消息推送到地图列表:

  List<Map> messages = [];

  [...]

  messages.insert(0, {"data": 1, "message": "Hello, how are you?"}); //Message from user 1
  messages.insert(0, {"data": 2, "message": "I am fine."}); //Message from user 2

现在,我怎样才能在本地设备上保护这些数据(消息列表)并在启动应用程序时加载它?

我已经尝试过共享首选项,但它只允许我存储字符串类型的列表,而不是地图。

我可以将 Map 类型的 List 转换为 String 类型的 List 然后使用它吗?

【问题讨论】:

  • 嗨!使用数据库来存储复杂的数据,比如这个消息。看看 sqflite - pub.dev/packages/sqflite
  • 感谢您的回答。实际上,我想存储的只是这些数据。我认为将每个 Map 转换为 String 然后将 Shared Preferences 与字符串列表一起使用会更容易。所有其他数据都存储在 Firestore 中,但由于大量读取和写入,消息的存储数据量非常大。

标签: list flutter dart type-conversion sharedpreferences


【解决方案1】:

编辑! SharedPreferences 仅存储以下类型的数据:

  • 字符串
  • 布尔

在这种典型情况下,您将使用 SharedPreferences 来存储 String 类型。 为此,您需要从您的数据中生成一个字符串类型。因此您将转换一个列表 => 字符串。 为此,您需要添加一段非常短的代码来生成您的 String 。

List<Map> myData = [map2,map1];
jsonEncode(myData);

这个想法是将您的 List 转换为 Json 数据,以便您可以将其存储为 String 并在需要时对其进行解码。

【讨论】:

  • 谢谢,这是解决我问题的关键。
  • 很高兴我能帮助你,但实际上你可以将 List 编码为字符串,它会为你节省一些代码行,我再次编辑这段代码,这样你就明白我的意思了
  • 现在我明白你的意思了。这是一个非常简单的解决方案,谢谢。
  • 请注意,这篇文章得到了答案,所以遇到同样问题的人会有一些解决方案,谢谢
【解决方案2】:

我找到了这篇文章: How to convert map to string?

这是我的解决方案: 我有一个包含所有共享首选项功能的课程。 现在,当有一条消息添加到地图列表中时,我会调用一个 setMessages 函数,该函数将这个列表中的每个地图转换为一个字符串。 这个字符串被添加到一个新的字符串列表中。 然后这个字符串列表与共享首选项一起存储。

在 initState 上,我调用一个函数来获取具有共享首选项的字符串列表。 对于此列表中的每个元素,我将 String 转换为 Map。 此地图被添加到地图列表中,然后在最后返回,以便列表视图可以使用它。

这是我的代码:

  static Future setMessages(List<Map> messages) async {
    List<String> messagesString = [];
    messages.forEach((element) {
      messagesString.add(json.encode(element));
    });
    await _preferences.setStringList(_keyUsername, messagesString);
  }

  static List<Map> getMessages() {
    List<String> messagesString =
        _preferences.getStringList(_keyUsername) ?? [];
    List<Map> messages = [];
    if (messagesString.isNotEmpty) {
      messagesString.forEach((element) {
        messages.add(json.decode(element));
      });
    }
    return messages;
  }

json.encode 和 json.decode 解决了我的问题。 我也考虑过使用 sqflite 并像 @Mol0ko 建议的那样设置一个本地数据库,但在我的情况下,只有这些小数据让这个解决方案更容易保存和加载聊天消息。

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2020-04-02
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多