Блок счетчик для корзины покупок - PullRequest
0 голосов
/ 06 февраля 2019

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

ItemCounterBloc

  final _itemCounterSubject = BehaviorSubject<int>(seedValue: 0);
  final _cartItemsController = StreamController<List<CartItem>>();
  int count = 0;


  ItemCounterBloc(Item item){

    _cartItemsController.stream
    .map((list) => list.any((cartItem)=> cartItem.item == item))
    .listen((increment){
      count += 1;
      _itemCounterSubject.add(count);
    });


  }
  Sink<List<CartItem>> get cartItems => _cartItemsController.sink;

  ValueObservable<int> get isInCart => _itemCounterSubject.stream.distinct().shareValue(seedValue: 0);

  void dispose(){
    _cartItemsController.close();
    _itemCounterSubject.close();
  }
}

Счетчик

StreamBuilder<int>(
            stream: _bloc.isInCart,
            initialData:0,
            builder: (context, snapshot) => Text('${snapshot.data}')

Также у меня есть еще один блок для добавления товаров в корзину.

1 Ответ

0 голосов
/ 26 апреля 2019

Существует полный пример того, как построить систему корзины покупок.Включая следующие детали:

  • Добавление / удаление товаров из корзины
  • Счетчик AppBar с количеством товаров в корзине
  • Корзина BLOC

https://github.com/Ephenodrom/FlutterAdvancedExamples/tree/master/lib/examples/shoppingCart

Вот как может выглядеть ваш BLOC:

class ShoppingCartBloc implements BlocBase {
  static const String TAG = "ShoppingCartBloc";

  ShoppingCart cart = ShoppingCart();

  /// Sinks
  Sink<Product> get addition => itemAdditionController.sink;
  final itemAdditionController = StreamController<Product>();

  Sink<Product> get substraction => itemSubtractionController.sink;
  final itemSubtractionController = StreamController<Product>();

  /// Streams
  Stream<ShoppingCart> get cartStream => _cart.stream;
  final _cart = BehaviorSubject<ShoppingCart>();

  ShoppingCartBloc() {
    itemAdditionController.stream.listen(handleItemAdd);
    itemSubtractionController.stream.listen(handleItemRem);
  }

  ///
  /// Logic for product added to shopping cart.
  ///
  void handleItemAdd(Product item) {
    Logger(TAG).info("Add product to the shopping cart");
    cart.addProduct(item);
    cart.calculate();
    _cart.add(cart);
    return;
  }

  ///
  /// Logic for product removed from shopping cart.
  ///
  void handleItemRem(Product item) {
    Logger(TAG).info("Remove product from the shopping cart");
    cart.remProduct(item);
    cart.calculate();
    _cart.add(cart);
    return;
  }

  ///
  /// Clears the shopping cart
  ///
  void clearCart() {
    cart.clear();
  }

  @override
  void dispose() {
    itemAdditionController.close();
    itemSubtractionController.close();
  }
}

class ShoppingCart {
  List<Product> products = [];
  double priceNet;
  double priceGross;
  double vatAmount;

  void addProduct(Product p) {
    products.add(p);
  }

  void remProduct(Product p) {
    products.remove(p);
  }

  void calculate() {
    priceNet = 0;
    priceGross = 0;
    vatAmount = 0;
    products.forEach((p) {
      priceNet += p.priceNet;
      priceGross += p.priceGross;
      vatAmount += p.vatAmount;
    });
  }

  void clear() {
    products = [];
    priceNet = 0;
    priceGross = 0;
    vatAmount = 0;
  }
}

class Product {
  final String name;
  final double priceNet;
  final double priceGross;
  final double vatAmount;
  final double tax;

  Product(
      {this.name, this.priceNet, this.priceGross, this.vatAmount, this.tax});
}
...