首页 > 解决方案 > 如何保存列表在共享偏好中

问题描述

该列表是 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 PreferencesandJson不是必需的,如果保存此类东西更好,将尝试使用任何其他包。

标签: jsonflutterdartsharedpreferencessaving-data

解决方案


该错误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();

推荐阅读