이전 정리 : 2024.06.04 - [FLUTTER] - [Flutter] Bloc 개념 이해하기 1

 

[Flutter] Bloc 개념 이해하기 1

블록을 배우기 이전에 stream 의 개념을 알아야 더 이해하기 쉽다. Streams스트림은 비동기 데이터의 시퀀스이다.파이프는 Stream 이고 그 안을 흐르는 물을 비동기 데이터라고 이해하면 쉽다.dart에

kimsw509.tistory.com

Using a Cubit

이제 여러가지를 응용해 볼 차례이다.

 

Basic Usage

main.dart

void main(){
	final cubit = CounterCubit();
	print(cubit.state); // 0
	cubit.increment();
	print(cubit.state); // 1
	cubit.close();
}

 

위는 기본적으로 사용한 것이다.

 

Stream Usage

Future<void> main() async {
  final cubit = counterCubit();
    final subscription = cubit.stream.listen(print); // 1
    cubit.increment();
    await Future.delayed(Duration.zero);
    await subscription.cancel();
    await cubit.close();
}

위를 보면 CounterCubit을 구독 하고 있다가 상태 변화가 일어나면 print를 호출한다. 그 후 increment를 호출해서 상태 변화를 야기하고 cancel 해서 더이상 스트림을 구독하지 않는다.

 

Observing a Cubit

Cubit의 상태가 변하면 change가 호출된다. 이를 onChange를 통해 관찰할 수 있다.

counter_cubit.dart

class CounterCubit extends Cubit<int> {
  CounterCubit() : super(0);
    
  void increment() => emit(state +1)
    
  @override
  void onChange(Change<int> change) {
    super.onChange(change);
    print(change);
    }
}

 

BlocObserver

블록옵져버를 이용하면 모든 상태 변화를 한곳에서 볼수 있다.

simple_bloc_observer.dart

class SimpleBlocObserver extends BlocObserver {
    @override
    void onChange(BlocBase bloc, Change change) {
    	super.onchange(bloc, change);
        print('${bloc.runtimeType} $change');
    }
}

 

Cubit Error Handing

모든 Cubit은 addError가 있어서 에러가 발생했을때를 알수 있다.

counter_cubit.dart

class CounterCubit extends Cubit<int> {
  CounterCubit() : super(0);
  
  void increment(){
    addError(Exception('increment error!'), StackTrace.current);
    emit(state +1);
  }
  
  @override
  void onChange(Change<int> change) {
    super.onChange(change);
    print(change);
  }
  
  @override
  void onError(Object error, StackTrace stackTrace) {
    print('$error, $stackTrace');
    super.onError(error, stackTrace);
  } 
}

 

onError는 BlocObserver에서 override하여 전역적인 에러를 잡아낼수 있다.

simple_bloc_observer.dart

class SimpleBlocObserver extends BlocObserver {
  @override
  void onChange(BlocBase bloc, Change change) {
    super.onChange(bloc, change);
    print('$bloc.runtimeType} $change');
  }
  
  @override
  void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
    print('${bloc.runtimeType} $error $stackTrace');
    super.onError(bloc, error, stackTrace);
  }
}

 

+ Recent posts