I found an excellent way to make a filter using both Equatable and Block
But I want to convert it to Get. I tried a lot for days, but I couldn't..Can I get help converting it to Get, please ?
The filter method consists of three classes, the first FilterEvent :
abstract class FilterEvent extends Equatable {
const FilterEvent();
@override
List<Object> get props => [];
}
class FilterLoad extends FilterEvent {
@override
List<Object> get props => [];
}
class LocationFilterUpdated extends FilterEvent {
final LocationFilter locationFilter;
const LocationFilterUpdated({required this.locationFilter});
@override
List<Object> get props => [locationFilter];
}
Second FilterState :
class FilterState extends Equatable {
const FilterState();
@override
List<Object> get props => [];
}
class FilterLoading extends FilterState {}
class FilterLoaded extends FilterState {
final Filter filter;
const FilterLoaded({this.filter = const Filter()});
@override
List<Object> get props => [filter];
}
Finally Block:
class FilterBlock extends Block<FilterEvent, FilterState> {
FilterBlock() : super(FilterLoading());
@override
Stream<FilterState> mapEventToState(FilterEvent event) async* {
if (event is FilterLoad) {
yield* _mapFilterLoadToState();
}
if(event is LocationFilterUpdated){
yield* _mapLocationFilterUpdated(event, state)
}
}
Stream<FilterState> _mapFilterLoadToState() async*{
yield* FilterLoaded(filter: Filter(locationsFilter: updatedLocationFilters));
}
Stream<FilterState> _mapLocationFilterUpdated(LocationFilterUpdated event , FilterState state) async*{
if(state is FilterLoaded){
final List<LocationFilter> updatedLocationFilters =
state.filter.locationsFilter.map((locationFilter) {
return locationFilter.id == event.locationFilter.id
? event.locationFilter
: locationFilter;
}).toList();
FilterLoaded(filter: Filter(locationsFilter: updatedLocationFilters));
}
}
}