【问题标题】:How to save a List<type> in Shared Prefrences如何在 Sharedpreferences 中保存 List<type>
【发布时间】:2021-10-11 17:02:19
【问题描述】:

列表类型为Contact,是从contacts_service包中获取的Class。

我尝试先将其保存为jsonEncode,然后将其保存为列表:

List<Contact> contacts = [];

void saveContacts() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    final encoded = jsonEncode(contacts)
    prefs.setStringList('contactList', encoded);
}

并加载它:

void loadContacts(){
    SharedPreferences prefs = await SharedPreferences.getInstance();
    contacts = jsonDecode(prefs.getString('contactList'))

但我收到错误List&lt;dynmaic&gt; instead of List&lt;Contact&gt;

所以我尝试将其转换为Map

    SharedPreferences prefs = await SharedPreferences.getInstance();

    var encoded= jsonEncode(contacts, toEncodable: (c) {
      if (c is Contact) {
        return c.toMap();
      }
    });
    prefs.setStringList('contactList', encoded);

和加载:

    SharedPreferences prefs = await SharedPreferences.getInstance();
    contacts =  (jsonDecode(prefs.getString('List'))as List ).map((e) {return 
    Contact.fromMap(e);});

但我得到了String is not a subtype of type 'List&lt;dynamic&gt;' in type cast

所以现在我不知道还能做什么。

注意:使用Shared PreferencesJson 不是必需的,如果保存此类内容更好,将尝试使用任何其他包。

【问题讨论】:

    标签: json flutter dart sharedpreferences saving-data


    【解决方案1】:

    错误List&lt;dynamic&gt; instead of List&lt;Contact&gt; 告诉您,当您执行jsonDecode(prefs.getString('contactList')) 时,它会被反序列化为List&lt;dynamic&gt;,如果您希望它是List&lt;Contact&gt; 类型,您必须将孩子转换为您想要的map((c) =&gt; c as Contact)).toList() 类型。

    编码:

    List<Contact> contacts = [];
    SharedPreferences prefs = await SharedPreferences.getInstance();
    final encoded = jsonEncode(contacts)
    prefs.setStringList('contactList', encoded);
    

    解码:

    SharedPreferences prefs = await SharedPreferences.getInstance();
    contacts = jsonDecode(prefs.getString('contactList')).map((c) => c as Contact)).toList();
    

    【讨论】:

    • 我收到type _InternalLinkedHashMap&lt;String, dynamic&gt; is not a subtype of type 'Contact' in type cast,也map 在手动输入时不显示,所以我认为您的代码结构有问题@Daniel Evangelista
    • 上面的代码是从List&lt;Contact&gt;而不是地图编码的。
    • 我不明白你的意思,你能提供一个例子@Daniel Evangelista
    猜你喜欢
    • 2020-10-20
    • 2015-03-22
    • 2020-08-02
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多