我有一个保存在对象中并存储在共享首选项中的字符串列表。
我已经使用ScopedModel进行状态管理,并且试图从这里的共享首选项中读取列表。
class Item {
String _weight;
String _name;
String _id;
Item(this._weight, this._name, this._id);
Item.fromJson(Map<String, dynamic> m) {
_weight = m['weight'] as String;
_name = m['name'] as String;
_id = m['id'] as String;
}
String get id => _id;
String get name => _name;
String get weight => _weight;
Map<String, dynamic> toJson() => {
'weight': _weight,
'name': _name,
'id': _id,
};
}
位于ScopedModel文件夹中的我的模型,该文件夹向下传递;
mixin ListItem on Model {
String itemKey = 'itemKey';
List<Item> _items = [];
List<Item> get items {
return List.from(_items);
}
Future<Null> readList() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final data = json.decode(prefs.getString(itemKey).toString());
final item = List<Item>.from(data.map((i) => Item.fromJson(i)));
_items = item;
print(jsonDecode(prefs.getString(itemKey)));
notifyListeners();
}
Future<Null> addItem({String id, String name, String weight}) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final Item item = Item(
id,
name,
weight,
);
_items.add(item);
prefs.setString(itemKey, jsonEncode(_items));
notifyListeners();
}
Future<Null> deleteProduct() async {
notifyListeners();
}
}
我的有状态小部件的一部分,该小部件运行initState以便从sharedPreferences调用列表
class _ListItemsState extends State<ListItems> {
final MainModel _model = MainModel();
final TextEditingController controller = TextEditingController();
@override
void initState() {
_model.readList();
super.initState();
}
@override
Widget build(BuildContext context) {
return ScopedModelDescendant<MainModel>(
builder: (BuildContext context, Widget child, MainModel model) {
return Scaffold(
appBar: AppBar(),
body: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate([
TextField(
controller: controller,
),
FlatButton(
child: Text('Submit'),
onPressed: () {
model.addItem(
id: controller.text,
name: controller.text,
weight: controller.text,
);
},
),
]),
),
model.items.length > 0
? SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Dismissible(
key: Key(model.items[index].id),
background: Container(
color: Colors.redAccent,
),
onDismissed: (DismissDirection direction) {
model.deleteProduct();
},
child: ListTile(
leading: Text(model.items[index].name),
trailing: Text(model.items[index].weight),
onTap: () {},
),
);
},
childCount: model.items.length,
),
)
: SliverFillRemaining(),
],
));
},
);
}
}
我的问题是在initState
上列表没有出现在readList()中-我不确定自己做错了什么,因为当我运行print(json.decode(prefs.getString(itemKey));
时它会调用列表从sharedPreferences中保存为[{weight: HelloWorld, name: HelloWorld, id: HelloWorld}]
的项目,看起来应该可以解码。
任何人都可以指出我在做什么错吗?预先感谢。
答案 0 :(得分:0)
在您的代码中,您有2种不同的模型:
最终MainModel _model = MainModel();
和构建器中的另一个模型
builder:(BuildContext上下文,Widget子项,MainModel模型)
看起来_model和模型之间没有连接/链接/映射。您必须像在this discussion中那样将它们链接在一起。