Nós podemos usar uma super classe para identificar o evento, e subclasses para identificar sub-eventos: Alterar o contador é o evento abstrato, enquanto incrementar o contador é um sub-evento de alterar o contador. E ao utilizar classes ao invés de Enum's, nós podemos receber propriedades da interface e passar para o BLoC, veja o exemplo abaixo:
abstract class CounterEvent {
final int value;
const CounterEvent(this.value);
}
class IncrementEvent extends CounterEvent {
const IncrementEvent(int valueToIncrement) : super(valueToIncrement);
}
class DecrementEvent extends CounterEvent {
const DecrementEvent(int valueToDecrement) : super(valueToDecrement);
}
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0);
@override
Stream<int> mapEventToState(CounterEvent event) async* {
switch (event.runtimeType) {
case IncrementEvent:
yield state + event.value;
break;
case DecrementEvent:
yield state - event.value;
break;
}
}
}