import 'dart:async'; import 'package:thesis_shop/models/product.dart'; import 'package:thesis_shop/service/product_service.dart'; import 'package:thesis_shop/utils/disposable.dart'; part 'product_bloc_events.dart'; part 'product_bloc_states.dart'; class ProductBloc implements Disposable { final ProductService _productService; var _productsState = ProductsState.loading(); ProductsState get productsState => _productsState; final _productsStateController = StreamController.broadcast(); Sink get _productsStateSink => _productsStateController.sink; Stream get productsStateStream => _productsStateController.stream; final _loadProductEventController = StreamController.broadcast(); Sink get loadProductSink => _loadProductEventController.sink; ProductBloc(this._productService) { _handleLoadProductEvents(); } void _handleLoadProductEvents() { _loadProductEventController.stream.listen((_) async { _productsState = ProductsState.loading(); _productsStateSink.add(_productsState); try { final products = await _productService.fetchProducts(); _productsState = ProductsState.loaded(products); _productsStateSink.add(_productsState); } catch (err) { _productsState = ProductsState.error(err.toString()); _productsStateSink.add(_productsState); } }); } @override Future dispose() { return Future.wait([ _productsStateController.close(), _loadProductEventController.close(), ]); } }