【问题标题】:Save a List to SharedPreferences将列表保存到 SharedPreferences
【发布时间】:2020-11-28 00:49:29
【问题描述】:

我正在尝试保存从sql中拖出的列表以保存在SharedPreferences中,我尝试使用此代码:

static Future<List<User>> getUsers() async {
    final myUserId = await getUser();
    try {
      var myUser = myUserId;
      var map = Map<String, dynamic>();
      map['user'] = myUser;
      final response = await http.post(ROOT, body: map);
      //print('getUsers Response: ${response.body}');
      //print(myUser);
      if (200 == response.statusCode) {
        List<User> listContacts = parseResponse(response.body);
        SharedPreferences contacts = await SharedPreferences.getInstance();
        contacts.setStringList('contacts', listContacts);
        return listContacts;
      } else {
        return List<User>();
      }
    } catch (e) {
      return List<User>(); // return an empty list on exception/error
    }
  }

列表的User 类如下:

class User {
  final String firstName;
  final String lastName;
  final String imageLink;

  User({this.firstName, this.lastName, this.imageLink});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      firstName: json['firstName'] as String,
      lastName: json['lastName'] as String,
      imageLink: json['imageLink'] as String,
    );
  }
}

所以基本上数据已成功从数据库中提取出来,并且确实显示了它,但我想将数据保存到SharedPreferences,因此不必每次都加载。发生的错误是listContacts 不能分配给setStringList,因为它是List&lt;User&gt; 而不是List&lt;String&gt;,但我不知道我还能如何按顺序更改代码能够设置SharedPreferences

【问题讨论】:

  • 你可以试试contacts.setString('contacts',json.encode(listcontacts)) 我正在做的是再次将其编码为 json 格式,你也可以保存你的 json 响应,然后使用你的类提取它
  • @Krish Bhanushali,它确实按照你说的方式工作。但是存储后如何才能再次使用呢?以及如何将其设置为地图?
  • 请查看this

标签: flutter dart


【解决方案1】:

在这里你可以做的是

static Future<List<User>> getUsers() async {
final myUserId = await getUser();
try {
  var myUser = myUserId;
  var map = Map<String, dynamic>();
  map['user'] = myUser;
  final response = await http.post(ROOT, body: map);
  //print('getUsers Response: ${response.body}');
  //print(myUser);
  if (200 == response.statusCode) {

    List<User> listContacts = parseResponse(response.body);
    SharedPreferences contacts = await SharedPreferences.getInstance();
    contacts.setString('contacts',json.encode(response.body)); //Here saved the response
    return listContacts;
  } else {
    return List<User>();
  }
} catch (e) {
  return List<User>(); // return an empty list on exception/error
}


 }

现在我可以使用它来获取它

SharedPreferences contacts = await SharedPreferences.getInstance();
var response = json.decode(contacts.getString('contacts'));
List<User> listContacts = parseResponse(response.body);

然后您从共享偏好中取回您的数据

【讨论】:

  • 获取代码是进入静态 Future 内部还是必须在外部创建另一个?
  • 它已经可以工作了,因为它已经异步了。但更好的是你从外面获取它只是为了清楚地理解
  • 哦...抱歉@Krish Bhanushali,但是在获取 response.body 时出现问题...
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 2017-11-09
  • 2011-10-26
  • 2021-09-28
  • 2016-06-23
  • 2016-06-15
相关资源
最近更新 更多