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 编辑:(无法从可迭代列表中获取数据)
使用 Flutter FutureBuilder 迭代 JSON 中的对象数组