Flutter 개발 상자

[Flutter Stream③] StreamSubscription 활용 본문

Flutter

[Flutter Stream③] StreamSubscription 활용

망고상자 2023. 11. 12. 21:56
728x90

StreamSubscription

 

정의

말그대로 스트림의 구독

Stream.listen을 사용하여 Stream을 수신하면 StreamSubscription 개체가 반환된다.

  StreamSubscription<T> listen(void onData(T event)?,
      {Function? onError, void onDone()?, bool? cancelOnError});

listen 함수를 보면 StreamSubscription의 반환값이 보인다.

 

앞서 listen 함수를 써봤을때 반환값을 딱히 저장하진 않았었는데 이 반환값으로 무엇을 할 수 있는걸까?

 

기본 사용법

void main() async {
  final Stream<int> stream = Stream.periodic(const Duration(milliseconds: 200), (count) {
    return count;
  }).take(4);

  final StreamSubscription<int> streamSubscription = stream.listen(
    (event) {
      print('event : $event');
    },
    onDone: () {
      print('완료');
    },
    onError: (error, stackTrace) {
      print('에러 : ${error.toString()}');
    },
  );

  await Future.delayed(const Duration(milliseconds: 300));
  streamSubscription.pause();
  streamSubscription.resume();
  await Future.delayed(const Duration(milliseconds: 200));
  streamSubscription.cancel();
  streamSubscription.resume(); // 다시 실행되지 않음
}

 

출력값은 0, 1이 출력된다.

pause, resume, cancel 모두 직관적인 말그대로의 기능을 수행한다.

 

onData, onDone, onError

void main() async {
  final Stream<int> stream = Stream.periodic(const Duration(milliseconds: 200), (count) {
    return count;
  }).take(4);

  StreamSubscription<int> streamSubscription = stream.listen(
    (event) {
      print('event : $event');
    },
    onDone: () {
      print('완료');
    },
    onError: (error, stackTrace) {
      print('에러 : ${error.toString()}');
    },
  );

  // 위의 listen의 파라미터로 넣어준 onData, onDone, onError 모두 override 되어 무시된다.
  streamSubscription.onData((data) { print('숫자 $data'); });
  streamSubscription.onDone(() { print('스트림 종료'); });
  streamSubscription.onError((error, stackTrace) { print('오류'); });
}

이것 역시 어렵지 않다. onlisten의 파라미터로 넣어준 함수를 여기서도 넣어줄 수 있으며 기존의 함수를 덮어쓰기 해준다.

 

 

요약

  • StreamSubscription은 스트림을 수신하는 개체, 스트림의 구독자.
  • 이벤트를 받았을때 동작을 처리하고, 구독 일시중지, 취소를 할 수 있다.

 

728x90