我正在尝试使用flutter中的共享首选项包保存和加载列表。
由于共享的首选项不支持将List<String>
以外的列表保存为setStringList()
(在我的情况下,List<String>
不能满足我的需要),因此我选择了使用.toString()
将我的列表转换为字符串,并使用setString()
将其保存。
保存该文件就可以了,但是现在我无法加载列表了。
我看到其他人建议将String作为JSON加载,但是看来.toString()
并没有提供有效的JSON,所以这是不可能的。
我还尝试过将String强制转换为列表...不足为奇,这也不起作用。
我似乎找不到任何将List转换为JSON的方法,所以我只能以这种方式保存和加载它,而且似乎也找不到任何方法来加载.toString()列表。好吧,一个列表。
我不确定现在该怎么办,因为我似乎找不到找到此列表的方法。
任何帮助将不胜感激!
答案 0 :(得分:3)
您可以使用jsonEncode
和jsonDecode
。
import 'dart:convert';
void main() {
var list = [1, 2, 3, 4];
String json = jsonEncode(list);
print(json);
List list2 = jsonDecode(json);
print(list2);
}
答案 1 :(得分:1)
我认为.toString()不会有任何帮助。您需要远离Shared_Preferences并找到一种以支持您正在使用的数据类型的方式持久化数据的方法。 (您正在使用哪种数据类型?)
以下是Flutter提供的有关使用SQFlite创建持久性的指南:https://flutter.dev/docs/cookbook/persistence/sqlite
根据您的需求,Firebase也可能是您的解决方案。
答案 2 :(得分:1)
要将^ asserts position at start of a line
\. matches the character . literally (case sensitive)
.+ matches any character (except for line terminators)
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of a line
转换为json字符串,可以执行以下操作:
List<String>
然后,您可以使用import 'dart:convert';
List<String> myList = ...;
String json = jsonEncode(myList);
要将其转换回列表,请使用setString()
答案 3 :(得分:0)
我不明白为什么它对您不起作用,也许您错过了一些东西。
您应该使用setString()
方法将json保存为字符串,并且要获取它们时,请使用getString()
方法。而且也不支持boolean
类型,因此对于它们,您也需要这样做。
看一下这个例子,这是完美的工作。我这样保存我的List
:
void _saveList() async {
List<dynamic> list = ['1','2','3','4'];
prefs = await SharedPreferences.getInstance();
prefs.setString('list', json.encode(list));
List<dynamic> stringList = json.decode(prefs.getString('list'));
print(stringList.runtimeType);
print(stringList);
}
输出:
List<dynamic>
[1, 2, 3, 4]
您所需要的只是将List
转换为JSON
并使用setString()
方法保存,当需要时,使用getString()
方法并在解码后JSON
。
另外,您还需要将List
的通用类型设置为<dynamic>
,因为在获得列表后,它将变为List<dynamic>
。
希望它会起作用。