1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
thesis_shop/lib/bloc/product_bloc.dart

53 lines
1.6 KiB

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<ProductsState>.broadcast();
Sink<ProductsState> get _productsStateSink => _productsStateController.sink;
Stream<ProductsState> get productsStateStream =>
_productsStateController.stream;
final _loadProductEventController =
StreamController<LoadProductEvent>.broadcast();
Sink<LoadProductEvent> 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<void> dispose() {
return Future.wait([
_productsStateController.close(),
_loadProductEventController.close(),
]);
}
}