[Flutter] 플러터 Stream Controller 클래스를 알고보자

오늘도 알고보자·2022년 2월 24일
1

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이어서 꽂혀서 들어오는거라 이게 제일 이상적인 구조이다.

1개의 댓글

comment-user-thumbnail
2022년 12월 7일

잘보고갑니다성원님ㅋ

답글 달기