BlocListener

特定某条件时执行(BlocListener

BlocListener는 Flutter에서 Bloc 또는 Cubit 패턴을 사용할 때, 상태 변화에 대한 부수 효과(side effects)를 처리하기 위한 위젯입니다. BlocBuilder가 상태 변화에 따라 UI를 재구성하는 데 사용되는 반면, BlocListener는 상태 변화에 따라 특정 작업(예: 네비게이션, 대화상자 표시, 로그 기록 등)을 실행하는 데 사용됩니다.

사용 방법

BlocListener는 특정 Bloc 또는 Cubit의 상태 변화를 감지하고, 이에 따라 부수 효과를 발생시키는 데 사용됩니다.

BlocListener<BlocType, BlocState>(
  listener: (context, state) {
    if (state is SpecificState) {
      // 특정 상태 변화에 대한 작업 수행
    }
  },
  child: ChildWidget(),
)

  • BlocType: 감시하고자 하는 Bloc 또는 Cubit의 타입입니다.
  • BlocState: 해당 Bloc 또는 Cubit의 상태 타입입니다.
  • listener: 상태 변화에 따라 실행할 작업을 정의하는 함수입니다. 이 함수는 contextstate를 매개변수로 받습니다.
  • child: BlocListener가 적용될 자식 위젯입니다.

기능

  • 부수 효과 처리: 상태 변화에 따라 다양한 작업(네비게이션, 토스트 메시지, 대화상자 표시 등)을 수행할 수 있습니다.
  • 조건부 실행: 특정 상태 또는 상태 조건에 따라 코드를 실행할 수 있습니다.
  • 상태 관리와 UI 분리: 상태 관리 로직과 UI 로직을 분리하여 코드의 가독성과 유지보수성을 높일 수 있습니다.

예시

BlocListener<AuthenticationBloc, AuthenticationState>(
  listener: (context, state) {
    if (state is AuthenticationFailure) {
      Navigator.of(context).pushNamed('/login');
    }
  },
  child: HomePage(),
)

이 예시에서, AuthenticationBloc의 상태가 AuthenticationFailure로 변경되면, 사용자를 로그인 화면으로 네비게이트합니다.

주의 사항

  • BlocListener는 상태 변화에 대해 한 번만 반응합니다. 즉, 같은 상태로의 연속된 변화에는 반응하지 않습니다.
  • BlocListener는 부수 효과를 처리하는 데 초점을 맞추고 있으므로, UI를 직접 빌드하는 데에는 사용되지 않습니다. UI 재구성이 필요한 경우 BlocBuilder 또는 BlocConsumer를 사용합니다.
  • BlocListenerflutter_bloc 패키지의 일부이므로, 이를 사용하기 위해서는 해당 패키지를 프로젝트에 추가해야 합니다.

listenWhen

listenWhen은 Flutter에서 Bloc 또는 Cubit 패턴을 사용할 때, 특정 조건에서만 리스너(listener)를 실행하도록 설정하는 함수입니다. 일반적으로 BlocListener 또는 BlocConsumer와 함께 사용되며, 상태 변화가 발생할 때마다 리스너가 실행되는 것이 아니라, 특정 조건을 만족할 때만 리스너가 호출되도록 합니다.

사용 방법

listenWhen 함수는 이전 상태와 현재 상태를 매개변수로 받고, 리스너가 실행될 조건을 반환하는 부울 식을 정의합니다.

BlocListener<BlocType, BlocState>(
  listener: (context, state) {
    // 상태 변화에 따른 액션
  },
  listenWhen: (previousState, currentState) {
    // 리스너가 실행될 조건
    return true or false;
  },
)

  • BlocType: 감시하고자 하는 Bloc 또는 Cubit의 타입입니다.
  • BlocState: 해당 Bloc 또는 Cubit의 상태 타입입니다.
  • listener: 상태 변화에 따라 실행할 작업을 정의하는 함수입니다.
  • listenWhen: 리스너가 실행될 조건을 정의하는 함수입니다.

예시

BlocListener<AuthenticationBloc, AuthenticationState>(
  listener: (context, state) {
    if (state is AuthenticationFailure) {
      // 로그인 실패 처리
    }
  },
  listenWhen: (previousState, currentState) {
    // 이전 상태가 로그인 시도 상태이고 현재 상태가 실패 상태일 때만 리스너를 실행
    return previousState is AuthenticationLoading && currentState is AuthenticationFailure;
  },
)

이 예시에서 listenWhen은 로그인 시도(AuthenticationLoading)에서 실패(AuthenticationFailure)로 상태가 변화했을 때만 리스너를 실행하도록 조건을 설정합니다.

주의 사항

  • listenWhen을 사용할 때는 리스너가 필요한 정확한 조건을 명확하게 정의해야 합니다.
  • 모든 상태 변화에 대해 리스너를 실행하고 싶지 않을 때 listenWhen을 사용하면 효과적입니다.
  • listenWhen은 상태 변화를 모니터링하지만, UI를 재구성하지는 않습니다. UI의 재구성이 필요하다면 BlocBuilder 또는 BlocConsumerbuildWhen을 사용하세요.
  • listenWhenflutter_bloc 패키지의 일부이므로, 이를 사용하기 위해서는 해당 패키지를 프로젝트에 추가해야 합니다.
Last Updated:
Contributors: RiGang