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
: 상태 변화에 따라 실행할 작업을 정의하는 함수입니다. 이 함수는context
와state
를 매개변수로 받습니다.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
를 사용합니다.BlocListener
는flutter_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
또는BlocConsumer
의buildWhen
을 사용하세요.listenWhen
은flutter_bloc
패키지의 일부이므로, 이를 사용하기 위해서는 해당 패키지를 프로젝트에 추가해야 합니다.