JsonDecode从SharedPreferences到List <object>

时间:2019-05-17 23:00:19

标签: json list dart flutter sharedpreferences

我有一个保存在对象中并存储在共享首选项中的字符串列表。

我已经使用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}]的项目,看起来应该可以解码。

任何人都可以指出我在做什么错吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

在您的代码中,您有2种不同的模型:

  

最终MainModel _model = MainModel();

和构建器中的另一个模型

  

builder:(BuildContext上下文,Widget子项,MainModel模型)

看起来_model和模型之间没有连接/链接/映射。您必须像在this discussion中那样将它们链接在一起。