본문 바로가기
Flutter

Flutter Bloc 패턴

by YoonTaeseong 2020. 12. 20.

기존에 프로바이더를 사용했던 플러터 구조에서 조금 더 AAC (안드로이드 아키텍처 컴포넌트 ) 와 비슷한 bloc 패턴으로 리펙토링을 하기로 결심하고 기존 프로젝트를 수정하게 되었다.

Bloc 패턴 알아보기

우선 블록이라 함은 Business Logic of Components 의 줄임말으로

여러가지 상태관리 중

  • setState
  • redux
  • Provider
  • Bloc
  • InheritedWidget

하나로 개발자들간에 자주 쓰이는 패턴이다.

그전에 상태관리에 대해 상태가 무엇인지 왜 상태관리를 해야하는지 설명하도록 하겠습니다.

상태 (State)

쉽게 해석하자면 앱 내부의 데이터 라고 보면 될거같다. 유저가 어떤 행동을 취했을 때 내부에서 변하는 데이터가 상태(state)라고 합니다.

상태관리 (state management)

왜 상태관리가 필요할까 ?

간단한 카운터 앱 이거나 todo 면 미들웨어가 필요 없을테지만 조금만 앱의 덩치가 커지면 setState 만으로는 상태 관리하는데 어려움이 있을것입니다.
이 때문에 따로 상태를 관리할 수 있는 미들웨어 (여기선 Bloc) 이 필요합니다.

Bloc 패턴

블록패턴에서 있어야할 두 가지는 State ( 현재 상태 ) 와 Event ( 특정 이벤트 ) 입니다.

각 이벤트 별로 분기 처리를 해주어 이벤트가 발생 할 때 마다 mapEventToState 가 호출이 됩니다.

@override
Stream<CourseState> mapEventToState(BaseEvent event) async* {
    if (event is AEvent) {
      yield* mapLoadEventToState(event);
    } else if (event is BEvent) {
      yield* mapRefreshEventToState(event);
    }
}

State

객체 비교를 용이하게 해주는 Equatable 을 상속한 BaseState 를 하나 만들고 분기처리하기 위한 State 만드는 방식으로 제작합니다.

ex)

class UpdatingState extends BaseState {}

class InitialState extends BaseState {}

class LoadingState extends BaseState {}

Event

State 와 마찬가지로 유저가 어떤 행위를 했을 때 어떤 이벤트를 발생시킬것인지 각 분기별로 제작합니다.

class LoadEvent extends BaseEvent {}

class RefreshEvent extends BaseEvent {}

Bloc

위에서 만들어 준 State 와 Event 를 사용하는 블록 Bloc<BaseEvent, BaseState> 을 상속받아 비즈니스 로직을 state와 event 로 분기처리를 여기서 구현합니다.

ex)

@override
Stream<CourseState> mapLoadEventToState(CourseEvent event) async* {
    try {
      final freeState = state;
      if (freeState is FreeInitialState) {
        yield FreeLoadingState();
        final response = await freeRepository.fetchFreeCourses(10);
        yield FreeLoadedState(courses: response);
      } else if (freeState is FreeLoadedState) {
        yield FreeUpdatingState();
        final response = await freeRepository.fetchFreeCourses(10,
            offset: freeState.courses.length);

        final updateList = freeState.courses..addAll(response);

        yield FreeLoadedState(courses: updateList);
      }
    } on Exception {}
}

참고

https://github.com/felangel/bloc

'Flutter' 카테고리의 다른 글

flutter instagram follow 코드 수정기  (0) 2019.11.20
Flutter 첫 밋업 후기  (0) 2019.11.16
Flutter StreamBuilder란??  (0) 2019.10.29
CustomPagePushed  (0) 2019.10.19
GridView정의 두가지 방법  (0) 2019.10.18

댓글