颤振我不能用SharedPreference保存对象

2022-01-30 14:54:03 标签 flutterdart

我知道有这样的问题,但我想通过我写的代码问我的问题。

我创建了一个对象,并把它传递到一个列表中我把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;
}
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码