【问题标题】:how can i store List<object> in sharedpreferences using provider?如何使用提供程序将 List<object> 存储在 sharedpreferences 中?
【发布时间】:2021-11-23 19:38:09
【问题描述】:

所以基本上这是我的提供者,我想要的是如何将来自提供者的模型数据存储到共享首选项中,然后如何对其进行解码以将其显示在书签页面中?

class bookmark extends ChangeNotifier{
  int _count = 0;
  List<bookmarkModel> bookM = [];
  
  void addCount(){
    _count++;
   notifyListeners();
  }
  
  void addItems(bookmarkModel i){
   bookM.add(i);
   notifyListeners();
  }

  int get  count => _count;
  List<bookmarkModel> get  bookMList => bookM;

}

这是我的模型:

import 'package:flutter/cupertino.dart';

class bookmarkModel{
  String title;
  String subtitle;
  int num;

  bookmarkModel({this.title, this.subtitle, this.num});

  bookmarkModel.fromJson(Map<String,dynamic> json) :
  title = json['title'], 
  subtitle = json['sutitle'], 
  num = json['num'];

  Map<String, dynamic> toJson()=>{
    'title':title,
    'subtitle':subtitle,
    'num': num
  }; 
}

【问题讨论】:

    标签: flutter dart sharedpreferences provider


    【解决方案1】:

    SharedPreferences 只能用于存储小而简单的值。它不适合用作数据库。

    您可以使用sharedPreferences 来存储boolStringint 和简单的Lists(不是对象或地图的列表)。据我所知,它甚至无法存储doubles

    尝试使用SQfliteHive (No-SQL) 在本地存储更复杂或更广泛的数据。

    【讨论】:

    • 我明白了,你说得对,我对 hive 和 sqflite 一无所知,这花了我太多时间,我想有办法这样做,无论如何感谢你的诚实知识。
    【解决方案2】:

    您已经准备好使用toJosnfromJson,只需将bookM 转换为地图josnEnode() 并使用josnDecode() 将其取回。

    试试下面的代码:

    void saveBookmark() async{
        SharedPreferences prefs = await SharedPreferences.getInstance();
        final String List = jsonEncode(bookM, toEncodable: (c)=> c.toJson());        
        await prefs.setString('BookMarkList', List);
      }
    
      void loadBookMark() async{
        SharedPreferences prefs = await SharedPreferences.getInstance();
        final String saved = prefs.getString('BookMarkList');
        final List<dynamic> decoded = jsonDecode(saved);
        bookM = decoded.map((bookmark) => bookmarkModel.fromJson(bookmark));
      }
    

    【讨论】:

    • mmmm 很抱歉这么说,但我的大脑停止工作,我不知道在哪里使用这些方法,我在提供程序类中使用了它们,并且 toJson 下有一个错误行,你有任何想法?
    • 你能分享错误的内容吗?而且由于这些方法在提供程序中,您可以在任何您想要的地方调用它们,可以使用按钮完成保存并通过在 initState 中调用 loadBookMark 或类似的方式进行加载,但不必在提供程序本身内部启动
    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 2020-08-02
    • 2021-10-21
    • 1970-01-01
    • 2020-10-20
    • 2022-01-17
    • 2019-10-05
    • 2021-10-11
    相关资源
    最近更新 更多