我知道有这样的问题,但我想通过我写的代码问我的问题。
我创建了一个对象,并把它传递到一个列表中我把key和list作为参数并把列表保存为setStringList但它没有保存,我没有得到任何错误。
SharedPreference类:
class SharedPrefs {
int counter = 0;
save(String key, list) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey('counter')) {
prefs.setInt('counter', counter); // set the counter
} else {
counter = prefs.getInt('counter')!;
}
if (!prefs.containsKey(key + counter.toString())) {
prefs.setStringList(key + counter.toString(), list);
prefs.setInt('counter', counter + 1);
}
}
Future<List<NotePages>> loadAllPages() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<NotePages> pages = [];
final keys = prefs.getKeys();
var shared;
for (String key in keys) {
shared = prefs.getStringList(key);
if (shared[0] == 'page') {
NotePages page = NotePages(
type: shared[0], pageName: shared[1], createdTime: shared[2]);
pages.add(page);
} else {
continue;
}
}
return pages;
}
getValue(key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.get(key);
}
}
这是我试图拯救的方式:
child: TextButton(
onPressed: () {
NotePages page = NotePages(
type: 'page',
pageName: myController.text,
createdTime: DateTime.now());
List<String> pageList = [
page.type,
page.pageName,
page.createdTime.toIso8601String()
];
prefs.save('page', pageList);
Navigator.pop(context);
}
这是我尝试加载的方式:
SharedPrefs prefs = SharedPrefs();
getPages() async {
notePages = await prefs.loadAllPages();
}
@override
void initState() {
super.initState();
getPages();
for (var i = 0; i < notePages.length; i++) {
dropDownItemValue.add(notePages[i].pageName);
}
dropDownItemValue.add('');
dropDownItemValue.add('Add Page');
print(dropDownItemValue);
// selected value must be contain at dropDownItemValue
selectedValue = dropDownItemValue[0];
}
# # #getPages()
function'函数的返回类型是Future<void>
..
添加代码dropDownItemValue
will run before init将在初始化notePages
..
所以你需要等待如下的函数。
@override
void initState() {
super.initState();
getPages().then((_) {
for (var i = 0; i < notePages.length; i++) {
dropDownItemValue.add(notePages[i].pageName);
}
dropDownItemValue.add('');
dropDownItemValue.add('Add Page');
print(dropDownItemValue);
// selected value must be contain at dropDownItemValue
selectedValue = dropDownItemValue[0];
});
}
编辑
我认为使用getStringList()并使用不是List类型的键会导致在获取List时出现问题。下面添加一个if-branch怎么样?
Future<List<NotePages>> loadAllPages() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<NotePages> pages = [];
final keys = prefs.getKeys();
var shared;
for (String key in keys) {
if (key == 'counter') continue; // <--- This
shared = prefs.getStringList(key);
if (shared[0] == 'page') {
NotePages page = NotePages(
type: shared[0], pageName: shared[1], createdTime: shared[2]);
pages.add(page);
} else {
continue;
}
}
return pages;
}