Dart: выход из функции, если внутри цикла foreach - PullRequest
2 голосов
/ 30 апреля 2020

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

Ниже приведен мой фрагмент кода.

void addOrderToCart(Product product, int quantity, String color, String size) {
    _lastOrder = Order(product, quantity, _orderId++, color, size);

    _orders.forEach((element) {
      if(element.product.id == _lastOrder.product.id){
       element.colors.add(color);
       element.sizes.add(size);
       element.quantity = element.quantity + quantity;
       notifyListeners();
       return;
      }
    });
    _orders.add(_lastOrder);
    notifyListeners();
  }

Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Я думаю, вы должны вернуть bool или любой другой вместо void и использовать for вместо forEach.

Вот решение, которое вы ищете.

bool addOrderToCart(Product product, int quantity, String color, String size) {
    _lastOrder = Order(product, quantity, _orderId++, color, size);


    for(var element in _orders){
      if (element.product.id == _lastOrder.product.id) {
        element.colors.add(color);
        element.sizes.add(size);
        element.quantity = element.quantity + quantity;
        notifyListeners();
        return true;
      }
    }
    _orders.add(_lastOrder);
    notifyListeners();
    return true;
  }

Надеюсь, это поможет.

Добрый день.

1 голос
/ 30 апреля 2020

Dart не поддерживает нелокальные возвраты, поэтому возврат из обратного вызова не нарушит l oop. Обратный вызов Dart forEach возвращает void.

Вы можете использовать any вместо forEach, поскольку any обратный вызов возвращает bool. Поэтому вы можете изменить свой код следующим образом.

void addOrderToCart(Product product, int quantity, String color, String size) {
    _lastOrder = Order(product, quantity, _orderId++, color, size);

    _orders.any((element) {
      if(element.product.id == _lastOrder.product.id){
       element.colors.add(color);
       element.sizes.add(size);
       element.quantity = element.quantity + quantity;
       notifyListeners();
       return true;
      }
      return false;
    });
    _orders.add(_lastOrder);
    notifyListeners();

  }

Надеюсь, это поможет вам.

Удачного кодирования!

...