블록을 배우기 이전에 stream 의 개념을 알아야 더 이해하기 쉽다.

 

Streams

스트림은 비동기 데이터의 시퀀스이다.

파이프는 Stream 이고 그 안을 흐르는 물을 비동기 데이터라고 이해하면 쉽다.

dart에서는 이를 쉽게 만들수 있다.

Stream<int> countStream(int max) async* {
	for (int i = 0; i < max; i ++ ){
    		yield i;
        }
}

 

aysnc* 를 사용함으로서 yield 키워드를 사용할 수 있고 stream 데이터를 반환한다. 위의 예는 integer stream을 반환한다.

위의 예를 비슷하게 사용하여 다른 값들을 반환할 수 있다.

 

Future<int> sumStream(Stream<int> stream) async {
	int sum = 0;
    await for (int value in stream){
    	sum += value;
    }
    return sum;
}

 

위의 함수를 보면 async 로 함수를 표시해서 await 키워드를 사용 할수 있고 Future 를 반환 가능해진다.

이렇게 대략 적으로 스트림을 봤으면 이제 Bloc 의 코어 패키지인 Cubit을 배울수 있다.

 

Cubit

CubitBlocBase를 상속한  클래스이며 여러 타입의 상태(state)를 매니지 할수 있도록 상속 가능하다. 

Cubit은 함수를 공개 하므로서 상태 변화 트리거를 걸 수 있다.

 

Creating a Cubit

 

counter_cubit.dart

class CounterCubit extends Cubit<int> {
	CounterCubit() : super(0);
}

Cubit을 만들때는 어떤 타입의 상태를 컨트롤 할 것인지 정의해 줘야한다. 위의 CounterCubit의 경우 int 타입을 통해 상태를 다루게 되지만 복잡한 경우에는 원시타입이 아닌 클래스로 상태를 컨트롤해줘야한다.

 

그 다음으로 우리가 해줘야 할 것은 Cubit의 initial state를 정해주는 것이다. super 값에 값을 넣어줌으로서 해결이 가능하다.

 

counter_cubit.dart

class CounterCubit extends Cubit<int> {
	CounterCubit(int initalState) : super(initialState);
}

 

Cubit State Changes

모든 Cubit은 emit 을 통해 상태를 바꿀수 있다.

counter_cubit.dart

class CounterCubit extends Cubit<int> {
	CounterCubit() : super(0);
    
    void increment() => emit(state + 1);
}

 

 

+ Recent posts