JsonDecode в список <Object>из SharedPreferences - PullRequest
0 голосов
/ 18 мая 2019

У меня есть список строк, который содержится в объекте и хранится в общих настройках.

Я использовал 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 голосов
/ 18 мая 2019

В вашем коде у вас есть 2 разные модели:

final MainModel _model = MainModel ();

и другая модель от разработчика

builder: (контекст BuildContext, дочерний Widget, модель MainModel)

Похоже, что между _model и моделью нет связи / связи / карты.Вы должны связать их вместе, как в этом обсуждении .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...