Flutter
Bloc 에서 if 는 되는데 Switch는 안되는 이유와 해결법
까사파파
2024. 1. 20. 16:48
계산기 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;