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을 쓰면서 둘 중 하나만 쓰지는 않을 것 같다. 각각 개발에 맞게 알맞은 사용법이 있을 것 같다. 예를 들어
이런 식으로 활용하지 않을까 싶다.