如何使用提供程序将 List<object> 存储在 sharedpreferences 中?

Posted

技术标签:

【中文标题】如何使用提供程序将 List<object> 存储在 sharedpreferences 中?【英文标题】:how can i store List<object> in sharedpreferences using provider? 【发布时间】: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
  ; 

【问题讨论】:

【参考方案1】:

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

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

尝试使用SQflite 或Hive (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 或类似的方式进行加载,但不必在提供程序本身内部启动

以上是关于如何使用提供程序将 List<object> 存储在 sharedpreferences 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 List<Object> 转换为 List<MyClass>

java 如何将List<Object[]>转换成List<实体>?

如何将两个List<Map<String,Object>>合并为一个

java 将Object转成List

如何将 List<KeyValuePairs<int,object>> 保存为 SQLite 表?

如何将map<string list<>>转换成城map<string,object>