如何使用共享首选项在 Flutter 中存储和保护地图列表? (扑动,共享首选项)

How can I store and safe a List of Maps in Flutter using Shared Preferences? (Flutter, SharedPreferences)

我正在尝试在我的 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 类型的列表转换为字符串类型的列表,然后使用它吗?

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

  • 字符串
  • 布尔值

在这种典型情况下,您将使用 SharedPreferences 来存储 String 类型。 为此,您需要从 data.So 生成一个 String 类型,您将转换一个 List => String。 为此,这里有一段非常短的代码,您将添加它以生成您的 String 。

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

我们的想法是将您的列表转换为 Json 数据,以便您可以将其存储为字符串并在需要时对其进行解码。

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

这是我的解决方案: 我有一个包含所有共享首选项功能的 class。 现在,当有一条消息添加到地图列表时,我会调用一个 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 建议的那样,但在我的例子中,只有这些小数据使我更容易保存和加载聊天消息的解决方案。