json - 如何保存列表在共享偏好中
问题描述
该列表是 type 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
andJson
不是必需的,如果保存此类东西更好,将尝试使用任何其他包。
解决方案
该错误List<dynamic> instead of List<Contact>
告诉您,当您这样做时,jsonDecode(prefs.getString('contactList'))
它被反序列化为 a 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();
推荐阅读
- python - 如何更改for循环中的变量?
- visual-studio-code - 禁用 VS Code 警告“不会自动打开的子模块”
- javascript - 如何将此 javascript 片段放入functions.php?
- java - 由于 java.lang.IllegalStateException,应用程序不断崩溃
- cassandra - 从 Cassandra 列族中的冻结集列中获取不同的字段值
- python - 无法在 zsh 中使用活动 venv 运行 Django
- r - stargazer 如何转换模型对象
- python - 我在执行 GeneticAlgo 时遇到了一些错误
- python - How do I run through a list of links one by one and then scrape data using selenium(driver.get)?
- django - 尝试为我的产品显示多个图像