Flutter Dart: как я могу изменить значение свойства класса в списке классов - PullRequest
0 голосов
/ 28 сентября 2019

Здравствуйте, у меня возникла проблема, чтобы понять, как управлять свойствами класса, когда он является частью списка классов

Вот мои классы

class BasketItem {
  final String itemDescription;
  final String itemNote;

  BasketItem(
      {this.itemDescription,
      this.itemNote});
}

class AppData {
  static final AppData _appData = new AppData._internal();

  List<BasketItem> basketList = [];
  factory AppData() {
    return _appData;
  }
  AppData._internal();
}

final appData = AppData();

А вот мой Список

List<Container> _buildBasketList() {
    return appData.basketList.map((bList) {
      var container = Container(
        child: Builder(
          builder: (context) => Dismissible(
            key: Key(UniqueKey().toString()),
            background: Container(
              margin: EdgeInsets.all(8.0),
              color: kColorAccent,
              child: Align(
                  alignment: Alignment(-0.90, 0.00),
                  child: Icon(Icons.add_comment)),
            ),
            onDismissed: (direction) {
                final newItemToAdd = BasketItem(
                    itemDescription: bList.itemDescription,
                    itemNote: 'xxxxx',);

                appData.basketList.add(newItemToAdd);

                setState(() {});
                appData.basketList.remove(bList);

            },
            child: Stack(...)
          ),
        ),
      );
      return container;
    }).toList();
  }

Я хотел бы сделать следующее: когда исполняется onDismissed, я хотел бы изменить свойство itemNote на 'xxxxx'.Как я могу это сделать?На данный момент я удаляю BasketItem, который я провел, и создаю новый BasketItem, и я добавляю его в список.Проблема в том, что это не кажется эффективным, и это также добавляет элемент в конец списка, в то время как я хотел бы сохранить его в той же позиции / индекса, где он был.

Спасибо

1 Ответ

1 голос
/ 28 сентября 2019

Подход 1

Сделать поля в BasketItem не окончательными.Таким образом, вы можете изменить их.

class BasketItem {
  final String itemDescription;
  /*final*/ String itemNote;

  BasketItem(
      {this.itemDescription,
      this.itemNote});
}
// onDismissed will change itemNote.
....
    onDismissed: (direction) {
                setState(() {
                  bList.itemNote = 'xxxxx';
                });
            },
...

Подход 2

Заменить содержимое списка встроенным.Не удаляйте и не добавляйте


List<Container> _buildBasketList() {
    return appData.basketList.asMap().map((index, bList) {
      var container = Container(
        child: Builder(
          builder: (context) => Dismissible(
            key: Key(UniqueKey().toString()),
            background: Container(
              margin: EdgeInsets.all(8.0),
              color: kColorAccent,
              child: Align(
                  alignment: Alignment(-0.90, 0.00),
                  child: Icon(Icons.add_comment)),
            ),
            onDismissed: (direction) {
                setState(() {
                  appData.basketList[index] = BasketItem(
                    itemDescription: bList.itemDescription,
                    itemNote: 'xxxxx',);
                });
            },
            child: Stack(...)
          ),
        ),
      );
      return container;
    }).toList();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...