簡體   English   中英

如何使用共享首選項存儲和保護 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。

我可以將 Map 類型的列表轉換為字符串類型的列表然后使用它嗎?

編輯 ! SharedPreferences僅存儲以下類型的數據:

  • 細繩
  • 布爾
  • 雙倍的

在這種典型情況下,您將使用 SharedPreferences 來存儲 String 類型。 要實現這一點,您需要從您的數據中生成一個字符串類型。因此您將轉換一個列表 => 字符串。 為此,您需要添加一段非常短的代碼來生成字符串。

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

這個想法是將您的列表轉換為 Json 數據,以便您可以將其存儲為字符串並在需要時對其進行解碼。

我找到了這篇文章: 如何將 map 轉換為字符串?

這是我的解決方案:我有一個 class 和我的所有共享首選項功能。 現在,當有一條消息添加到地圖列表中時,我會調用 setMessages function,它將此列表中的每個 Map 轉換為字符串。 這個字符串被添加到一個新的字符串列表中。 然后這個字符串列表與共享首選項一起存儲。

在 initState 上,我調用 function 來獲取具有共享首選項的字符串列表。 對於此列表中的每個元素,我將字符串轉換為 Map。 將此 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 建議的本地數據庫,但在我的情況下,只有這個小數據使這個解決方案更容易保存和加載聊天消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM