将Json数组转换为List< Object>在Flutter [英] Convert Json Array to List<Object> in Flutter
问题描述
我是Flutter和Dart的新手,我一直在努力将值保存在共享首选项中,以便在我的应用程序重新启动时使用.我已经成功存储了变量,但是我还需要存储对象列表.我知道,由于共享首选项仅接受字符串列表,因此我需要将对象列表转换为JSON数组,并且在应用程序重新启动时,检索此列表并将其再次转换为对象列表.
I'm new to Flutter and Dart and I have been struggling with saving values in shared preferences to use when my app is restarted. I have successfully stored variables, but I also need object lists to be stored. I know that since shared preferences only accept String lists, I need to convert my object list into a JSON array and when the app is restarted, retrieve this list and convert it to an object list again.
我能够将对象列表编码为JSON,我得到了类似的东西:
I was able to encode the object list to JSON and I got something like this:
[{name: Rent, amount: 250}, {name: Insurance, amount: 105}]
我通过以下功能实现了这一点:
I achieved this with the following function:
void SaveLists(key, value) async { //where value is a List<Object>
final prefs = await SharedPreferences.getInstance();
List<dynamic> json_list = (value.map((i) => i.toJson())).toList();
prefs.setStringList(key, json_list); //this line causes the error
print('$json_list');
}
列表json_list包含上面显示的JSON数组.但是,当我尝试使用prefs.setStringList(key, json_list);
将其存储在共享首选项中时,出现以下错误:
The List json_list contains the JSON array that is shown above. However when I try to store it in the shared preferences with prefs.setStringList(key, json_list);
I get the following error:
Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<String>'
现在,假设我以某种方式成功地将其存储在共享首选项中,用prefs.getString('key')
调用时如何将JSON数组转换回List?
Now, let's say that I somehow store it successfully in shared preferences, how do I convert the JSON array back to a List when called with prefs.getString('key')
?
如果您需要看课,这里是:
In case you need to see the class, here it is:
import 'dart:convert';
class Random_expenses {
String name;
double amount;
Random_expenses({this.name, this.amount});
Random_expenses.fromJson(Map<String, dynamic> json)
: this.name = json['name'],
this.amount = json['amount'];
Map<String, dynamic> toJson() =>
{'name': this.name, 'amount': this.amount};
}
推荐答案
您可以在
下复制粘贴运行完整代码
您可以使用randomExpensesToJson(value)
将List<RandomExpenses>
另存为json字符串.
您可以通过randomExpensesFromJson(keyString)
You can copy paste run full code below
You can save List<RandomExpenses>
as a json string with randomExpensesToJson(value)
You can get List<RandomExpenses>
with randomExpensesFromJson(keyString)
代码段
List<RandomExpenses> randomExpensesFromJson(String str) =>
List<RandomExpenses>.from(
json.decode(str).map((x) => RandomExpenses.fromJson(x)));
String randomExpensesToJson(List<RandomExpenses> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
...
void saveData(String key, List<RandomExpenses> value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(key, randomExpensesToJson(value));
}
Future<List<RandomExpenses>> getData(String key) async {
final prefs = await SharedPreferences.getInstance();
String keyString = prefs.getString(key);
return Future.value(randomExpensesFromJson(keyString));
}
...
await saveData("key", randomExpensesList);
List<RandomExpenses> list = await getData("key");
print('${list[0].name} ${list[0].amount}');
print('${list[1].name} ${list[1].amount}');
输出
I/flutter (24879): Rent 250
I/flutter (24879): Insurance 105
完整代码
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';
List<RandomExpenses> randomExpensesFromJson(String str) =>
List<RandomExpenses>.from(
json.decode(str).map((x) => RandomExpenses.fromJson(x)));
String randomExpensesToJson(List<RandomExpenses> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class RandomExpenses {
String name;
int amount;
RandomExpenses({
this.name,
this.amount,
});
factory RandomExpenses.fromJson(Map<String, dynamic> json) => RandomExpenses(
name: json["name"],
amount: json["amount"],
);
Map<String, dynamic> toJson() => {
"name": name,
"amount": amount,
};
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
List<RandomExpenses> randomExpensesList = [
RandomExpenses(name: "Rent", amount: 250),
RandomExpenses(name: "Insurance", amount: 105)
];
void saveData(String key, List<RandomExpenses> value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(key, randomExpensesToJson(value));
}
Future<List<RandomExpenses>> getData(String key) async {
final prefs = await SharedPreferences.getInstance();
String keyString = prefs.getString(key);
return Future.value(randomExpensesFromJson(keyString));
}
void _incrementCounter() async {
await saveData("key", randomExpensesList);
List<RandomExpenses> list = await getData("key");
print('${list[0].name} ${list[0].amount}');
print('${list[1].name} ${list[1].amount}');
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
这篇关于将Json数组转换为List< Object>在Flutter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!