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.
53 lines
1.6 KiB
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(),
|
|
]);
|
|
}
|
|
}
|
|
|