Flutter 将 JSON 数组保存到 SharedPreferences

Posted

技术标签:

【中文标题】Flutter 将 JSON 数组保存到 SharedPreferences【英文标题】:Flutter Save JSON Array to SharedPreferences 【发布时间】:2019-09-23 18:30:18 【问题描述】:

如何将 JSON 数组保存到 SharedPreferences 中?

我在下面尝试了一些类似这样的代码,但出现了一些错误:

[错误:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:类型 “文本”不是“字符串”类型的子类型

for (var x = 0; x < dynamicwidget.length - 1; x++) 
  _listOrder=
    "id_product": dataJSON[x]["product_id"],
    "order_count": dynamicwidget[x].controller.text,
  ;


String json = jsonEncode(_listOrder);

SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(categoryname, json);

【问题讨论】:

用dynamicwidget[x].controller.text.toString()替换这个dynamicwidget[x].controller.text 感谢您的回答,但仍然无法正常工作 我认为问题只出在这一行 而不是像这样将 order_count 值保存在变量中,然后在此处分配它 【参考方案1】:

我建议您使用类似this(本地存储实现)的东西,用于保存和加载 JSON。

从代码 sn-p 本身,我无法确切告诉您是什么导致了此异常,但基本上每个地方都会出现 String,但您提供了一个实际的 Text 小部件。它可能是categoryname 变量。你从dynamicWidget 实例中得到什么样的controller?你确定controller.text 返回一个String

另一个注意事项:您在每个 for 循环中重新分配 _listOrder,而不是添加信息。你必须使用一个空的array,它将被每个循环填充。

【讨论】:

注意,谢谢参考 这个库是遗留的,因为它不支持空安全 从版本 4.0.0+1 开始,它已被设为 null 安全,因此可以照常使用【参考方案2】:

感谢大家提供这个问题。 我已经解决了这个问题并进行了一些更改。

_listOrder.clear();
    for (var x = 0; x < dynamicwidget.length; x++) 
      int jml = int.parse(dynamicwidget[x].controller.text == ""? "0": dynamicwidget[x].controller.text);
      if (jml > 0) 
        _listOrder.add(
          "id_product": dataJSON[x]["product_id"],
          "order_count": dynamicwidget[x].controller.text,
        );
      
    

    if (_listOrder.length > 0) 
      SharedPreferences prefs = await SharedPreferences.getInstance();
      Map<String, dynamic> _collOrder = Map<String, dynamic>();
      String sessjson = prefs.getString("orderlist");
      if (sessjson != null) 
        _collOrder = json.decode(sessjson);
        _collOrder.remove(categoryname);
      
      _collOrder[categoryname] = _listOrder;
      prefs.setString("orderlist", json.encode(_collOrder));
    

【讨论】:

以上是关于Flutter 将 JSON 数组保存到 SharedPreferences的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 无法将所有 json 数据从 api 响应保存到 Iterable List 编辑:(无法从可迭代列表中获取数据)

将检索到的json转换为flutter中的自定义对象列表

Flutter 从本地化 JSON 文件解析数组

使用 Flutter FutureBuilder 迭代 JSON 中的对象数组

将数组保存到 JSON 文件,然后使用 Array.push() 将数据保存在其中

Flutter 从列表中获取所有数据到 json