Flutter 개발 상자

[Flutter Stream④] StreamController 활용 본문

Flutter

[Flutter Stream④] StreamController 활용

망고상자 2023. 11. 12. 23:01
728x90

StreamController

 

개념

출처 : https://www.educative.io/answers/what-are-streamcontrollers-in-dart

 

일단 위의 그림을 보면 중간에서 Stream과 구독자의 중재역할을 해주는것으로 보인다.

StreamController는 새로운 개념이 아니라 단순히 스트림을 제어하는데 도움을 주는 도구라고 생각하면된다.

 

기본 사용법

void main() async {
  final StreamController streamController = StreamController();
  streamController.stream.listen(print);
  streamController.add('이벤트 발생');
  streamController.sink.add('1 2 3 4 5');
  streamController.addStream(Stream.periodic(const Duration(milliseconds: 100), (count) => count + 1,).take(5));
  await Future.delayed(const Duration(milliseconds: 500));
  streamController.close();
  // Bad state: Cannot add event after closing 에러 발생
  streamController.add('추가 이벤트 발생'); // 에러로 출력되지 않음.
}

 

add혹은 addStream을 통해 요소들을 추가한다.  close로 controller를 닫은 후에 추가하면 에러가 발생한다.

sink.add와 add는 동일한 동작 이다. sink.addStream도 마찬가지.

GPT의 말에 따르면 .add메서드는 .sink.add의 래퍼 역할을 담당하여 좀 더 간편한 문법을 제공해준다고한다.

 

기본 메서드

void main() async {
  final StreamController streamController = StreamController();
  streamController.add('이벤트');

  print(streamController.isClosed); // false
  print(streamController.isPaused); // true
  print(streamController.hasListener); // false
  
  streamController.done.then((_) => print('스트림 완료')); // close()가 호출된 이후에 실행됨
  streamController.sink; // Stream sink를 반환
}

 

다행히(?) 그렇게 메서드가 많진 않다.

T/F 를 반환하는 메서드는 이름 그대로의 역할을 하고

done의 경우 close()가 호출된 이후에 Future가 완료되고 sink는 위에서 봤듯이 굳이 사용하지 않아도 sink안의 메서드를 사용할 수 있으니 크게 쓸일은 없어보인다.

 

broadcast

 

개념

StreamController는 broadcast() 라는 팩토리 생성자를 가지고 있다.

이를 통해 생성하면 여러개의 리스너(구독자)가 동일한 스트림을 동시에 수신할 수 있게 된다.

일반 생성자로 생성된 컨트롤러를 중간에 broadcast 컨트롤러로 전환하는건 불가능하다.

 

기본 사용법

void main() async {
  final StreamController<String> controller = StreamController.broadcast();

  final StreamSubscription<String> subscription1 = controller.stream.listen((event) {
    print('1번구독자 : $event');
  });
  final StreamSubscription<String> subscription2 = controller.stream.listen((event) {
    print('2번구독자 : $event');
  });

  controller.add('이벤트 시작');
  controller.add('구독자님 안녕하세요.');
  
  // 출력
  // 1번구독자 : 이벤트 시작
  // 2번구독자 : 이벤트 시작
  // 1번구독자 : 구독자님 안녕하세요.
  // 2번구독자 : 구독자님 안녕하세요.
}

 

직접 사용해보니 어려운 개념은 아니다.

그냥 여러 리스너들이 동시에 이벤트를 수신하고 있다.

 

 

요약

  • StreamController는 Stream을 제어하는 도구
  • broadcast() 팩토리 생성자를 통해서 여러개의 리스너를 가질 수 있다.
728x90