如何编码和解码对象列表以便稍后将它们存储在 sharedpreferences 中?
How to encode and decode a list of objects to later store them in sharedpreferences?
我的代码:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:multi_select_flutter/multi_select_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Item {
final int id;
final String name;
Item({
this.id,
this.name,
});
Item.fromJson(Map<String, dynamic> json)
: id = json['i'],
name = json['n'];
Map<String, dynamic> toJson() {
return {
'i' : id,
'n' : name,
};
}
}
class ProfileScreen extends StatefulWidget {
@override
_ProfileScreenState createState() => _ProfileScreenState();
}
class _ProfileScreenState extends State<ProfileScreen> {
List<Item> selectedDogSizes = [];
@override
void initState() {
getData("dogSizes");
}
getData(String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var myList;
setState(() {
myList = prefs.getString(key);
});
selectedDogSizes = jsonDecode(myList) ?? [];
}
setData(List<Item> items, String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var myList = jsonEncode(items);
prefs.setString(key, myList);
}
List<Item> dogSizes = [
Item(id: 1, name: "Small"),
Item(id: 2, name: "Medium"),
Item(id: 3, name: "Big"),
];
@override
Widget build(BuildContext context) {
return ListView(
children: [
MultiSelectChipField<Item>(
items: dogSizes
.map((item) => MultiSelectItem<Item>(item, item.name))
.toList(),
initialValue: selectedDogSizes,
icon: Icon(Icons.check),
onTap: (values) {
selectedDogSizes = values;
setData(selectedDogSizes, "dogSizes");
},
),
],
);
}
}
我正在尝试存储用户是否选择了其中一个选项。为此,我使用了一个对象列表 'Items',每次更改所选元素的列表时,我都会尝试对列表进行编码并存储它。
E/flutter (10651): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<Item>'
E/flutter (10651): #0 _ProfileScreenState.getData (package:woofdates/screens/profileScreen.dart:47:5)
E/flutter (10651): <asynchronous suspension>
E/flutter (10651): #1 _ProfileScreenState.initState (package:woofdates/screens/profileScreen.dart:38:5)
E/flutter (10651): #2 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4765:58)
E/flutter (10651): #3 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter (10651): #4 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter (10651): #5 Element.updateChild (package:flutter/src/widgets/framework.dart:3324:20)
E/flutter (10651): #6 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #7 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #8 StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
E/flutter (10651): #9 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #10 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #11 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #12 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #13 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #14 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #15 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #16 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #18 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5647:32)
E/flutter (10651): #19 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6246:17)
E/flutter (10651): #20 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #21 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #22 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #23 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #24 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #25 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #26 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #27 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #28 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #29 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #30 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #31 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #32 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #33 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #34 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #35 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
E/flutter (10651): #36 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #37 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #38 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #39 StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
E/flutter (10651): #40 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #41 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
E/flutter (10651): #42 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #43 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #44 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #45 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #46 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #47 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #48 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #49 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #50 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #51 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #52 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #53 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #54 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #55 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #56 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #57 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #58 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #59 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #60 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #61 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #62 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #63 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #64 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #65 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #66 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #67 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #68 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #69 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2730:33)
E/flutter (10651): #70 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:913:20)
E/flutter (10651): #71 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
E/flutter (10651): #72 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
E/flutter (10651): #73 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
E/flutter (10651): #74 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
E/flutter (10651): #75 _rootRun (dart:async/zone.dart:1190:13)
E/flutter (10651): #76 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (10651): #77 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (10651): #78 _invoke (dart:ui/hooks.dart:251:10)
E/flutter (10651): #79 _drawFrame (dart:ui/hooks.dart:209:3)
E/flutter (10651):
我也尝试过使用包 json_serializable,结果出现了同样的错误。
我也可以将它作为一个 id 整数列表,然后将其编码为 json,但我也不知道如何从多个对象中获取整数。
像这样解码:
getData(String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var myList;
setState(() {
myList = prefs.getString(key);
});
var decodedString= jsonDecode(myList) ?? [];
selectedDogSizes = (decodedString as List).map((i) => Item.fromJson(i)).toList();
}
然后:
onTap: (values) {
selectedDogSizes = values;
setData(selectedDogSizes, "dogSizes");
getData("dogSizes");
setState((){});
},
我的代码:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:multi_select_flutter/multi_select_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Item {
final int id;
final String name;
Item({
this.id,
this.name,
});
Item.fromJson(Map<String, dynamic> json)
: id = json['i'],
name = json['n'];
Map<String, dynamic> toJson() {
return {
'i' : id,
'n' : name,
};
}
}
class ProfileScreen extends StatefulWidget {
@override
_ProfileScreenState createState() => _ProfileScreenState();
}
class _ProfileScreenState extends State<ProfileScreen> {
List<Item> selectedDogSizes = [];
@override
void initState() {
getData("dogSizes");
}
getData(String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var myList;
setState(() {
myList = prefs.getString(key);
});
selectedDogSizes = jsonDecode(myList) ?? [];
}
setData(List<Item> items, String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var myList = jsonEncode(items);
prefs.setString(key, myList);
}
List<Item> dogSizes = [
Item(id: 1, name: "Small"),
Item(id: 2, name: "Medium"),
Item(id: 3, name: "Big"),
];
@override
Widget build(BuildContext context) {
return ListView(
children: [
MultiSelectChipField<Item>(
items: dogSizes
.map((item) => MultiSelectItem<Item>(item, item.name))
.toList(),
initialValue: selectedDogSizes,
icon: Icon(Icons.check),
onTap: (values) {
selectedDogSizes = values;
setData(selectedDogSizes, "dogSizes");
},
),
],
);
}
}
我正在尝试存储用户是否选择了其中一个选项。为此,我使用了一个对象列表 'Items',每次更改所选元素的列表时,我都会尝试对列表进行编码并存储它。
E/flutter (10651): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<Item>'
E/flutter (10651): #0 _ProfileScreenState.getData (package:woofdates/screens/profileScreen.dart:47:5)
E/flutter (10651): <asynchronous suspension>
E/flutter (10651): #1 _ProfileScreenState.initState (package:woofdates/screens/profileScreen.dart:38:5)
E/flutter (10651): #2 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4765:58)
E/flutter (10651): #3 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter (10651): #4 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter (10651): #5 Element.updateChild (package:flutter/src/widgets/framework.dart:3324:20)
E/flutter (10651): #6 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #7 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #8 StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
E/flutter (10651): #9 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #10 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #11 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #12 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #13 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #14 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #15 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #16 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #18 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5647:32)
E/flutter (10651): #19 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6246:17)
E/flutter (10651): #20 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #21 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #22 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #23 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #24 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #25 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #26 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #27 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #28 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #29 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #30 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #31 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #32 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #33 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #34 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #35 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
E/flutter (10651): #36 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #37 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #38 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #39 StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
E/flutter (10651): #40 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #41 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
E/flutter (10651): #42 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #43 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #44 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #45 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #46 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #47 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #48 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #49 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #50 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #51 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #52 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #53 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #54 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #55 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #56 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #57 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #58 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #59 ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #60 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #61 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #62 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #63 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #64 StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #65 Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #66 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #67 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #68 Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #69 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2730:33)
E/flutter (10651): #70 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:913:20)
E/flutter (10651): #71 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
E/flutter (10651): #72 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
E/flutter (10651): #73 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
E/flutter (10651): #74 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
E/flutter (10651): #75 _rootRun (dart:async/zone.dart:1190:13)
E/flutter (10651): #76 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (10651): #77 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (10651): #78 _invoke (dart:ui/hooks.dart:251:10)
E/flutter (10651): #79 _drawFrame (dart:ui/hooks.dart:209:3)
E/flutter (10651):
我也尝试过使用包 json_serializable,结果出现了同样的错误。 我也可以将它作为一个 id 整数列表,然后将其编码为 json,但我也不知道如何从多个对象中获取整数。
像这样解码:
getData(String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var myList;
setState(() {
myList = prefs.getString(key);
});
var decodedString= jsonDecode(myList) ?? [];
selectedDogSizes = (decodedString as List).map((i) => Item.fromJson(i)).toList();
}
然后:
onTap: (values) {
selectedDogSizes = values;
setData(selectedDogSizes, "dogSizes");
getData("dogSizes");
setState((){});
},