颤振我无法使用共享首选项保存对象



我知道有这样的问题,但我想通过我写的代码问我的问题。我创建了一个对象并将其传递给一个列表我将key和list作为参数并将列表保存为setStringList但它不会保存,我也不会得到任何错误

SharedPreference class:

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()函数的返回类型为Future<void>。添加dropDownItemValue的代码将在初始化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()与一个键,不是类型的列表导致一个问题,当获得列表。像下面这样添加一个if分支怎么样?

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;
}

最新更新