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

时间:2021-05-27 19:56:58

标签: list flutter dart type-conversion 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 类型的 List 转换为 String 类型的 List 然后使用它吗?

2 个答案:

答案 0 :(得分:0)

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

  • 字符串
  • 布尔
  • 双重

在这种典型情况下,您将使用 SharedPreferences 来存储 String 类型。 为了实现这一点,您需要从您的数据生成一个字符串类型。因此您将转换一个列表 => 字符串。 要做到这一点,这里是一段很短的代码,您将添加它以生成您的 String 。

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

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

答案 1 :(得分:0)

我找到了这篇文章: 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 建议的本地数据库,但在我的情况下,只有这么少的数据使我可以更轻松地使用此解决方案来保存和加载聊天消息。