如何在 Sharedpreferences 中保存 List<type>

Posted

技术标签:

【中文标题】如何在 Sharedpreferences 中保存 List<type>【英文标题】:How to save a List<type> in Shared Prefrences 【发布时间】: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 不是必需的,如果保存此类内容更好,将尝试使用任何其他包。

【问题讨论】:

【参考方案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

以上是关于如何在 Sharedpreferences 中保存 List<type>的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sharedpreferences 中保存 List<type>

如何使用 SharedPreferences 从 Flutter 中的列表中保存多个布尔值

如何在颤动中将 Map<String, List<object>> 保存在 sharedPreferences 中?

如何将整数保存到 SharedPreferences [重复]

Android SharedPreferences,如何保存一个简单的int变量[重复]

如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载它们的状态