StreamController
- Stream을 매번 열었다가(listen) 닫는 건(cancel) 비효율적이다.
- 또한 스트림이 여러 개일때는 모든 스트림을 일일이 닫는 건 비효율적이다. 여러 스트림을 관리하기 위해 StreamController를 쓴다.
- StreamController는 Stream을 생성한다
- 내가 사용하는 clean architecture의 ViewModel에서 state의 변화나 UI에서 일어나는 이벤트를 관리할때 사용한다.
시나리오

- Counter라는 객체안에 실제로 count라는 값이있고 다른곳에서 이 count라는 객체를 관찰이 가능하게 만든다.
- 직접접근하는 형태가 아닌 Stream의 형태로 접근하도록한다.

- StreamController 사용시 꼭 타입을 적어야한다. count를 방출 하는데 타입이 int이니 int를 기재한다.
- 내부적으로 _count라는 값이 있는것이고, 외부적으로는 getter로 방출을 한다.
- int로 방출을 하는게 아닌 Stream의 타입으로 방출한다.
- streamController는 파이프라고 생각하자, 여기에 데이터를 계속 밀어넣는다, 밀어넣으면 이컨트롤러에 stream이라는 객체로 빠져나오게되고 외부에서 count로 접근하게되면 streamController에 들어간 값을 count에서 빼가는 형태이다.

- 기본값을 주면좋은데 cascade연산자와 add를 사용해서 주자.
- 객체 생성을하고 ..add (0)으로 0을넣은 인스턴스로 만들자

- 값을 내부적으로 증가하게 만드는 함수를 만들어주자.
- _count의 증감하는것을
- countStreamController.add 로 밀어넣는 것이다.
- 이렇게 하면 stream이 완성된다.
- 여기서 _count에서 조작을 해서 넣어주면 _count로 밀어넣고 빠져나가는 형태이다.
- 이게 한세트 이다.stream을 제공하는 클래스이다.
stream을 제공했다면 사용하는쪽을 만들자, Streambuilder로 만들어주자.

- FutrueBuilder와 같이 Streambuilder<타입> 을 지정해줘야한다.
- 우리가 만든 Counter 클래스를 사용할수있게 변수 counter를 만들어준다.
- stream으로 counter내의 만들어줬던 stream인 count.countStrem을 만들어준다.

- FutureBuilder때와 똑같이 snapshot.data를 사용한다.

- 그리고 onpressed에 increment를 넣어준다. 완성~
그럼 요걸 inheritedWidget과 같이 사용하면 어떨까


- 이렇게 counter 객체를 얻을수있다.
- StreamControllerSample 클래스는 stl이면서 const라서 한번 셋팅되면 리빌드 안되고 예외가 생길수가 없고, counter는 inheritedWidget이어서 꽂혀서 들어오는거라 이게 제일 이상적인 구조이다.
잘보고갑니다성원님ㅋ