728x90
/ 3. 만약 이벤트에 데이터가 필요하다면: class UpdateProduct extends TodaySaleEvent { final String productId; final double newPrice; UpdateProduct({ required this.productId, required this.newPrice, }); } 여기 괄호 안에 안들어가고 블럭쪽에서 따로 해주면 되는거 아냐? 아니면 다른곳에서 데이터 쓰면 되는거 아냐? 왜 여기에 쓰는거야? 특별한 이유가 있어?
이벤트 클래스에 데이터를 넣는 것은 "이벤트가 발생할 때 필요한 데이터를 함께 전달"하기 위해서입니다. 실제 사용 예시로 설명해드리겠습니다:
// 1. 데이터가 없는 단순 이벤트
class LoadTodaySaleProducts extends TodaySaleEvent {}
bloc.add(LoadTodaySaleProducts()); // 단순히 이벤트만 발생
// 2. 데이터가 필요한 이벤트
class UpdateProduct extends TodaySaleEvent {
final String productId;
final double newPrice;
UpdateProduct({
required this.productId,
required this.newPrice,
});
}
// 사용할 때:
bloc.add(UpdateProduct(
productId: '123',
newPrice: 15000.0
));
// 3. Bloc에서 처리:
on<UpdateProduct>((event, emit) async {
// event.productId와 event.newPrice에 접근 가능
await repository.updateProduct(
event.productId, // '123'
event.newPrice // 15000.0
);
});
만약 이벤트 클래스에 데이터를 넣지 않는다면:
// 👎 좋지 않은 방식
class UpdateProduct extends TodaySaleEvent {}
class TodaySaleBloc extends Bloc<TodaySaleEvent, TodaySaleState> {
String? productIdToUpdate; // 블록 내부에 상태 저장
double? newPriceToUpdate;
// 이벤트 발생 전에 데이터를 따로 설정해야 함
void prepareUpdate(String productId, double price) {
productIdToUpdate = productId;
newPriceToUpdate = price;
}
on<UpdateProduct>((event, emit) async {
// productIdToUpdate가 null이 아닌지 체크해야 함
if (productIdToUpdate != null && newPriceToUpdate != null) {
await repository.updateProduct(
productIdToUpdate!,
newPriceToUpdate!
);
}
});
}
// 사용할 때
bloc.productIdToUpdate = '123'; // 😱 상태 관리가 복잡해짐
bloc.newPriceToUpdate = 15000.0;
bloc.add(UpdateProduct());
이벤트에 데이터를 포함하는 것의 장점:
- 캡슐화: 이벤트와 관련 데이터가 하나의 단위로 관리
- 타입 안전성: 컴파일 타임에 필요한 데이터 체크
- 불변성: 이벤트 데이터가 변경되지 않음
- 명확성: 어떤 데이터가 필요한지 명확
- 테스트 용이성: 이벤트와 데이터를 한 번에 테스트 가능
예를 들어 좋아요 기능을 구현한다면:
// 이벤트에 데이터 포함
class ToggleFavorite extends TodaySaleEvent {
final String productId;
final String userId;
ToggleFavorite({
required this.productId,
required this.userId,
});
}
// 사용
bloc.add(ToggleFavorite(
productId: '123',
userId: 'user456'
));
// Bloc에서 처리
on<ToggleFavorite>((event, emit) async {
await repository.toggleFavorite(
event.productId,
event.userId
);
});
이렇게 이벤트에 데이터를 포함시키면 코드가 더 깔끔하고 관리하기 쉬워집니다.
728x90
'코딩 > 개념' 카테고리의 다른 글
폼이란? AJAX 란? (0) | 2025.02.05 |
---|---|
싱글톤 패턴 - fcm 토큰 관련 (0) | 2025.02.05 |
리버팟 AsyncValue의 장점-프로바이더와 비교 (0) | 2024.11.10 |
생명주기 이용 (0) | 2024.11.10 |
렌더링 할때 어떤 과정을 거치나? (0) | 2024.11.10 |