import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:farm_tpf/custom_model/Device.dart'; import 'package:farm_tpf/data/api/app_exception.dart'; import 'package:farm_tpf/data/repository/repository.dart'; import 'package:meta/meta.dart'; part 'device_event.dart'; part 'device_state.dart'; class DeviceBloc extends Bloc { final Repository repository; DeviceBloc({@required this.repository}) : super(DeviceInitial()); @override Stream mapEventToState( DeviceEvent event, ) async* { if (event is OpenScreen) { yield* _mapOpenScreenToState(); } else if (event is ControlDevice) { yield* _mapControlDeviceToState( event.currentDevices, event.updatedDeviceId); } } Stream _mapOpenScreenToState() async* { yield DisplayDevice.loading(); try { List devices = new List(); final response = await repository.getDevices(); devices = response; devices.sort((a, b) => (a.id).compareTo(b.id)); yield DisplayDevice.data(devices); } catch (e) { yield DisplayDevice.error(AppException.handleError(e)); } } Stream _mapControlDeviceToState( List currentDevices, int updatedDeviceId) async* { List devices = new List(); currentDevices.forEach((device) { if (device.id == updatedDeviceId) { var updatedStatus = device.status == "1" ? "0" : "1"; device.status = updatedStatus; } devices.add(Device.clone(device)); }); yield DisplayDevice.data(devices); } }