如何在 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<dynmaic> instead of List<Contact>
所以我尝试将其转换为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<dynamic>' in type cast
所以现在我不知道还能做什么。
注意:使用Shared Preferences
和Json
不是必需的,如果保存此类内容更好,将尝试使用任何其他包。
【问题讨论】:
【参考方案1】:错误List<dynamic> instead of List<Contact>
告诉您,当您执行jsonDecode(prefs.getString('contactList'))
时,它会被反序列化为List<dynamic>
,如果您希望它是List<Contact>
类型,您必须将孩子转换为您想要的map((c) => 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<String, dynamic> is not a subtype of type 'Contact' in type cast
,也map
在手动输入时不显示,所以我认为您的代码结构有问题@Daniel Evangelista
上面的代码是从List<Contact>
而不是地图编码的。
我不明白你的意思,你能提供一个例子@Daniel Evangelista以上是关于如何在 Sharedpreferences 中保存 List<type>的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sharedpreferences 中保存 List<type>
如何使用 SharedPreferences 从 Flutter 中的列表中保存多个布尔值
如何在颤动中将 Map<String, List<object>> 保存在 sharedPreferences 中?
如何将整数保存到 SharedPreferences [重复]