如何使用提供程序将 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
来存储bool
、String
、int
和简单的List
s(不是对象或地图的列表)。据我所知,它甚至无法存储doubles
。
尝试使用SQflite 或Hive (No-SQL) 在本地存储更复杂或更广泛的数据。
【讨论】:
我明白了,你说得对,我对 hive 和 sqflite 一无所知,这花了我太多时间,我想有办法这样做,无论如何感谢你的诚实知识。 【参考方案2】:您已经准备好使用toJosn
和fromJson
,只需将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>>合并为一个