코딩/개념

블럭 이벤트 뒤에{}의미

흑백 개발자 2024. 11. 6. 13:29
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());

이벤트에 데이터를 포함하는 것의 장점:

  1. 캡슐화: 이벤트와 관련 데이터가 하나의 단위로 관리
  2. 타입 안전성: 컴파일 타임에 필요한 데이터 체크
  3. 불변성: 이벤트 데이터가 변경되지 않음
  4. 명확성: 어떤 데이터가 필요한지 명확
  5. 테스트 용이성: 이벤트와 데이터를 한 번에 테스트 가능

예를 들어 좋아요 기능을 구현한다면:

// 이벤트에 데이터 포함
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