ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • bloc 이벤트 관리를 위한 transformEvents
    flutter 2021. 7. 26. 22:00

    flutter_bloc에서 bloc에 event를 add하면 bloc에 정의된 mapEventToState로 향합니다.

    bloc은 이벤트에 따른 로직을 거친뒤 상태에 대한 Stream을 리턴해줍니다.

     

    하지만 블록을 사용하다보면 특정 이벤트가 들어오는 빈도수를 조정한다거나, 이벤트에 대해 재정의해줘야 될 때가

    있습니다.

     

    예를들어 스패밍 공격을 당해 게시글 등록을 여러번 클릭하면 클릭한 횟수만큼 동일한 게시글이 포스팅될 수도 있습니다.

     

    그런 문제를 핸들링하기위해서 bloc 에서 transformEvents 메소드를 재정의할 필요가 있습니다.

     

    패키지의 설명을 보면

    기본적으로 mapEventToState 메소드로 가기위한 이벤트는 transitionFn 함수를 통과해야한다고 기술되어있습니다.

     

     

    transformEvents 는 다음과 같은 형태를띱니다.

    @override
    Stream<Transition<PostEvent, PostState>> transformEvents(events, transitionFn) {

      return 블라블라 

    }

     

    return에 들어가는 내용이라든지 인자의 이름이라든지 flutter_bloc의 버전마다 이름도 조금씩 다르고

    형태도 다르기 때문에 주의하는게 좋습니다. stackoverflow의 답변들도 최신 메소드랑 조금씩 다릅니다.

     

     

    어쨌든 편하게 bloc의 mapEventToState 로 가기전에 transformEvents에서 이벤트를 한번 핸들링해준다고 생각해도 될것같습니다.

     

    class bloc {

    첫번째 이벤트 핸들링

    transformEvents

     

    이벤트를 받는 

    mapEventToState

    }

     

    이렇게 보시면 될듯합니다.

     

     

    사용예제는 다음과 같습니다.

     

    @override
    Stream<Transition<PostEvent, PostState>> transformEvents(events, transitionFn) {

    *모든 이벤트를 들어온 순서대로 mapEventToState  로 보냅니다
    -> return events.asyncExpand(transitionFn);

     *가장 최근에 수신된 이벤트만 mapEventToState  로 보냅니다
    -> return events.switchMap(transitionFn);

     

     

    *이벤트 수신에 딜레이를 줍니다.

    들어오는 이벤트를 모두 내보내는게 아니라 정의된 duration 만큼 딜레이를 줄수있습니다.

    뒤에 붙은 distinct는 들어온 데이터가 이전 데이터와 같으면 건너띕니다.

    이때 event class에 객체 비교에 대한 정의가 제대로 되있어야 비교가 가능합니다.

    ->

    // return super.transformEvents(
    // events.debounceTime(const Duration(milliseconds: 500)).distinct(),
    // transitionFn,
    // );

     

    *이벤트에 딜레이를 주지않고 중복이벤트를 넘기지 않으려할때는 그냥 다음과 같이 사용하면됩니다.
    // return super.transformEvents(
    // events.distinct(),
    // transitionFn,
    // );
    }

     

    * dinstinct() 에 대한 설명을 보면,

    Equality is determined by the provided equals method. If that is omitted, the '==' operator on the last provided data element is used. 라고 기재되어있습니다. 이벤트가 중복되는지 판단할때 제공된 equals 메소드로 결정된답니다. 저도 처음에 예제대로 작성을 했는데 제대로 안되길래 찾아보니 , operator 재정의가 제대로 되있지 않았습니다.

     

     

     

     

    *위에도 썼지만 transformEvents 에 들어온 이벤트를 핸들링 하려면 , 바디에 내용을 정의하기 전에

    던져진 event 클래스에 데이터 값 비교가 제대로 되야 작동합니다.

     

    abstract class PostEvent extends Equatable{


    @override
    List<Object?> get props => [];
    }

     

    이벤트 값은 equatable 패키지의 operator를 재정의 하면  쉽게 비교가 가능합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.