如何使用 Get Storage 保存和检索 List<Map>

Posted

技术标签:

【中文标题】如何使用 Get Storage 保存和检索 List<Map>【英文标题】:How to save and retrieve a List<Map> with Get Storage 【发布时间】:2021-10-14 18:37:26 【问题描述】:

我正在尝试使用 GetStorage 保留一个简单的 List&lt;Map&lt;String,dynamic&gt;&gt;

文档说:

何时使用 GetStorage:

简单的地图存储。 http 请求缓存 简单用户信息的存储。 简单而持久的状态 存储您当前使用 sharedPreferences 的任何情况。

所以,我没有编码/解码为 json 字符串。

最后报错

type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>?' in type cast

这是我的代码,box.read() 方法抛出错误:

  final box = GetStorage();
  var payments = <Payment>[].obs;

  Future<void> savePaymentsToDB() async 
    var paymentsAsMap = payments.map((payment) => payment.toJson()).toList();
    await box.write('payments', paymentsAsMap);
  

  void getPaymentsFromDB() 
    var result = box.read<List<Map<String, dynamic>>>('payments');
    
    if (result != null) 
      payments =
          result.map((payment) => Payment.fromJson(payment)).toList().obs;
    
  

【问题讨论】:

【参考方案1】:

您需要将paymentsAsMap 编码为json 字符串。您模型上的 toJson 方法仅将该模型转换为 json 对象(键、值对)。要将其存储在共享首选项或getStorage 中,您应该将该 json 对象转换为字符串。

import 'dart:covert';

// Storing data
...
var paymentsAsMap = payments.map((payment) => payment.toJson()).toList();
String jsonString = jsonEncode(paymentsAsMap);
await box.write('payments', jsonString);

// fetching data
var result = box.read('payments');
dynamic jsonData = jsonDecode(result);
payments = jsonData.map((payment) => Payment.fromJson(payment)).toList().obs;

【讨论】:

我尝试了您的解决方案。现在我得到错误:类'List'没有实例getter'obs'。接收者:'_GrowableList'的实例(长度:1)尝试调用:obs 好的,我刚刚将 List 而不是动态定义为: List jsonData = jsonDecode(result);

以上是关于如何使用 Get Storage 保存和检索 List<Map>的主要内容,如果未能解决你的问题,请参考以下文章

如何上传图片Url上传到Fire Storage并同时保存在fireStore中使用Java

Chrome.storage.sync.set/get 不工作

如何使用 Zend_Mail_Protocol_Imap 或 Zend_Mail_Storage_Imap 批量检索电子邮件

从 Fire Storage 检索图像,但是如果图像不存在,则应用程序崩溃

使用.net核心Web API和jquery从天蓝色斑点中上传和检索图像

如何从 Android 上保存的帐户中检索 Facebook-AuthToken