我在用Flutter保存带有sharedPreference的列表时遇到问题,我有一个像这样的数组:
好,要保存列表“ TodosEventos”,请应用以下代码
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setStringList('events',todosEventos);
但是我在运行时遇到了这个问题
答案 0 :(得分:0)
事件类不是字符串。我建议您将列表另存为JSON:
import 'dart:convert' show json;
import 'package:shared_preferences/shared_preferences.dart';
void setList(String key, List<dynamic> value) async {
await setString(key, json.encode(value));
}
setList('key', todosEventos);
在这里讨论相同的问题: Can i store a List<dynamic> with shared preference
答案 1 :(得分:0)
Shared Preferences
基本上仅用于保存较小的值,通常是boolean
类的值。
因此,如果您想做类似“ ToDoList”之类的事情,则有一个 pub.dev上有一个名为pref_dessert的好的软件包,它可以完成保存此类数据的任务。或者,您也可以使用sqflite软件包在用户的设备上建立脱机数据库。
如果数据量较小,我建议您使用pref_dessert
。但是,如果复杂sqflite
,则最好使用它。
答案 2 :(得分:0)
SharedPrefrences允许您存储json。
所以我建议在事件类中添加一个toMap()方法:
Map<String, dynamic> toMap() {
return {
'imagePath': imagePath,
'title': title,
'eventId': eventId,
...
};
}
还有一个创建所有事件的映射的函数:
Map<String, dynamic> todoEventosMap() {
Map<String, dynamci> map;
todoEventos.forEach((event) {
// eventId should be unique
map[event.eventId] = event.toMap();
});
return map;
}
然后您可以将地图编码为json并保存。
import 'dart:convert';
await prefs.setString('events', json.encode(todosEventosMap()));
要从sharedPreferences中获取列表,请执行以下操作:
您可以为Event添加便捷工厂方法:
factory Event.fromMap(Map<String,dynamic> map) {
return Event(
imagePath = map['imagePath'],
title = map['title'],
eventId = map['eventId'],
...
);
}
创建todoEventos时,将地图传递到工厂:
List<Event> todoEventos;
var events = json.decode(await prefs.getString('events')) as Map<String, dynamic>;
events.forEach((eventId, eventMap) => todoEventos.add(Event.fromMap(eventMap)));
答案 3 :(得分:0)
否,但间接地是 主要逻辑是,您只需要在存储时对列表进行编码,而在检索时进行解码。
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setStringList('events',generateList(todosEventos));
在这里您可以从列表中生成字符串
generateList(todosEventos) {
Map list;
todoEventos.foreach((element) {
list[element.id] = element.toMap();
});
return json.encode(list);
}