flutter_bloc과 bloc 패키지에서는 Bloc패턴을 활용한 상태관리를 보다 편리하게 구현할 수 있도록 Bloc과 Cubit이라는 클래스가 존재한다.
Bloc을 사용하면서 이 두가지 클래스 중 어떤 것을 사용하는 것이 더 좋을까라는 궁금증이 있었는데 이러한 궁금증을 해소하기 위해 두 클래스의 차이점을 비교해보았다.
둘 다 UI에서 발생한 이벤트를 통해 데이터의 상태를 변화시키고 이를 emit 함수를 통해 UI에 반영하는 과정을 수행하지만 약간의 차이점이 존재한다.
emit을 통해 변경된 상태가 UI에 반영될 때는 Stream으로 전달된다.이러한 차이점을 예제를 통해 보면 아래와 같다.
//Date model
class City {
final String name;
final String country;
City({this.name='', this.country=''});
}
우선 예제 작성을 위해 위와 같은 City 모델을 만들었다.
class CityCubit extends Cubit<City> {
CityCubit():super(City());
void generateCity(String name, String country) {
final City city = City(name: name, country: country);
emit(city);
}
}
class CityBloc extends Bloc<CityEvent, City> {
CityBloc() : super(City()){
on<GenerateCityEvent>(
generateCity,
transformer: debounce(const Duration(milliseconds: 300))
);
}
FutureOr<void> generateCity(GenerateCityEvent event, Emitter<City> emit){
final City city = City(name: event.name, country: event.country);
emit(city);
}
EventTransformer<T> debounce<T>(Duration duration) {
return (events, mapper) => events.debounceTime(duration).flatMap(mapper);
}
}
abstract class CityEvent {}
class GenerateCityEvent extends CityEvent{
final String name;
final String city;
GenerateCityEvent({this.name = '', this.city = ''});
}
앞으로 Bloc을 쓰면서 둘 중 하나만 쓰지는 않을 것 같다. 각각 개발에 맞게 알맞은 사용법이 있을 것 같다. 예를 들어
이런 식으로 활용하지 않을까 싶다.