본문 바로가기

Flutter

Bloc 에서 if 는 되는데 Switch는 안되는 이유와 해결법

계산기 Bloc 예제로 +-/* 를 처리 한다. 처음 switch 로 해결 하려 했지만,

안된다 . 이유는 Dart 언어의 타입 시스템 때문에 이런 현상이 발생

 

Dart는 if 문에서 타입 추론을 수행하여 event가 특정 하위 타입(AddEvent, SubtractEvent 등)인지 확인. 각 분기에서 num1과 num2에 접근할 수 있음

 

But,

 

switch 문에서는 Dart가 이러한 타입 추론을 수행하지 않음.

event.runtimeType을 확인하더라도

Dart는 event를 CalculatorEvent 타입으로 간주

따라서 num1과 num2에 접근하려고 하면 오류가 발생

 

이 문제를 해결하려면 각 case 분기에서 수동으로

타입 캐스팅을 수행해야 함

 CalculatorBloc() : super(CalculatorInitial()) {
    on<CalculatorEvent>((event, emit) {
      // TODO: implement event handler
      if (event is AddEvent) {
        num result = calculatorRepo.add(num1: event.num1, num2: event.num2);
        emit(CalculatorResult(result: result));
      } else if (event is SubtractEvent) {
        num result =
        calculatorRepo.subtract(num1: event.num1, num2: event.num2);
        emit(CalculatorResult(result: result));
      } else if (event is MultiplyEvent) {
        num result =
        calculatorRepo.multiply(num1: event.num1, num2: event.num2);
        emit(CalculatorResult(result: result));
      } else if (event is DivideEvent) {
        num result = calculatorRepo.divide(num1: event.num1, num2: event.num2);
        emit(CalculatorResult(result: result));
      }



      switch (event.runtimeType) {
        case AddEvent:
          num result = calculatorRepo.add(num1: event.num1, num2: event.num2);
          emit(CalculatorResult(result: result));
          break;
        case SubtractEvent:
          num result = calculatorRepo.subtract(num1: event.num1, num2: event.num2);
          emit(CalculatorResult(result: result));
          break;
        case MultiplyEvent:
          num result = calculatorRepo.multiply(num1: event.num1, num2: event.num2);
          emit(CalculatorResult(result: result));
          break;
        case DivideEvent:
          num result = calculatorRepo.divide(num1: event.num1, num2: event.num2);
          emit(CalculatorResult(result: result));
          break;
        default:
        // Handle other events or throw an error
          break;
 

위 예제의 switch 는 에러가 난다 . 아래처럼 수정 해야 사용 할 수 있다 .

 

final addEvent = event as AddEvent;
 num result = calculatorRepo.add(num1: addEvent.num1, num2: addEvent.num2);
 emit(CalculatorResult(result: result));
 break;