Флаттер Удалить несколько элементов списка в цикле (несколько возвратов в цикле) - PullRequest
0 голосов
/ 26 июня 2019

У меня есть список продуктов.Это имеет категорию, subCategory1, subCategory2 и т. Д.

Когда пользователь отменяет выбор элемента категории.Они также не выбирают элементы подкатегории 1, подкатегории 2 и т. Д., Поскольку они являются дочерними элементами исходного элемента категории, например:

enter image description here

enter image description here

enter image description here

Итак, у меня есть цикл for, который просматривает дочерние элементы списка категорий и удаляет их следующим образом:

  // Remove a category item and all of its children
  if (categoryType == "category") {
    List<String> subCategory1Children = List<String>.from(
        snapshot.data.documents[gridIndex]['subCategory1Children']);

    // Remove the subcategory items
    for (int i = 0; i < foodDrinkMenuElements['subCategory1'].length; i++) {
      String subID = foodDrinkMenuElements['subCategory1'][i];
      int removalIndex = _indexOfListGridElement('subCategory1', subID);

      if (subCategory1Children.contains(subID)) {
        _removeCategoryGridItem(removalIndex, subID, 'subCategory1');
      }
    }

    //Remove the actual item being pressed
    _removeCategoryGridItem(listIndex + 1, id, categoryType);
  }

Который вызывает _removeCategoryGridItem () следующим образом:

void _removeCategoryGridItem(int removalIndex, String id, String categoryType) {
  _FoodandDrinkKey.currentState.removeItem(removalIndex,
      (BuildContext context, Animation<double> animation) {
    return _buildListItem(removalIndex, animation);
  });
  foodDrinkMenuElements[categoryType].remove(id);
}

Цикл For всегда заканчивается после удаления 1 элемента списка.Я предполагаю, что это из-за оператора return в функции _removeCategoryGridItem.

Я видел другие ответы, в которых говорится, чтобы поместить его в список и выполнить список, но я не вижу, как это применимо здесь.

Спасибо за помощь

1 Ответ

1 голос
/ 26 июня 2019

Цикл For всегда заканчивается после удаления 1 элемента списка. Я предполагаю, что это из-за оператора возврата в функции _removeCategoryGridItem.

Нет, как правило, единственный способ, которым функция может выйти из цикла в вызывающей функции, - это сгенерировать исключение.

Я не знаю, какой тип foodDrinkMenuElements[categoryType] возвращает, но при условии, что это List, Map или Set, вы не можете удалить элементы из коллекции , пока выполняете итерацию по коллекции .

Из List документации :

Как правило, не разрешается изменять длину списка (добавлять или удалять элементы) во время выполнения операции со списком .... Изменение длины списка во время итерации ... нарушит итерацию.

Существует аналогичный язык для Map и Set.

Я видел другие ответы, в которых говорится, чтобы поместить его в список и просмотреть список, но я не понимаю, как это применимо.

Это именно то, что вы должны сделать: вы должны очередь , какие элементы удалить, а затем обработать очередь, чтобы избежать изменения той же коллекции, по которой вы перебираете:

final pendingRemoves = List<void Function()>[];

// Remove the subcategory items
for (int i = 0; i < foodDrinkMenuElements['subCategory1'].length; i++) {
  String subID = foodDrinkMenuElements['subCategory1'][i];
  int removalIndex = _indexOfListGridElement('subCategory1', subID);

  if (subCategory1Children.contains(subID)) {
    pendingRemoves.add(() =>
        _removeCategoryGridItem(removalIndex, subID, 'subCategory1'));
  }
}

// Since an index is involved, you also need to remove in reverse order so that
// the queued indices still refer to the same elements.
for (pendingRemove in pendingRemoves.reversed) {
  pendingRemove();
}

//Remove the actual item being pressed
_removeCategoryGridItem(listIndex + 1, id, categoryType);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...