관리 메뉴

Bull

[Dart::Stream] listen method 본문

Computer Language/Dart

[Dart::Stream] listen method

Bull_ 2024. 8. 19. 14:45

listen 메소드는 스트림의 이벤트를 "구독(subscribe)"하는 것을 의미하며, 스트림이 데이터를 내보낼 때마다 등록된 콜백 함수가 호출된다. 이것은 스트림이 비동기적으로 데이터를 전달하는 방식이다. 스트림은 다음과 같은 세 가지 유형의 이벤트를 발생시킬 수 있다.

  1. 데이터 이벤트: 스트림에서 새로운 데이터 조각이 생성되었을 때 호출된다.
  2. 에러 이벤트: 스트림 처리 중에 오류가 발생하면 호출된다.
  3. 완료 이벤트: 스트림이 더 이상 이벤트를 생성하지 않을 때 호출된다.

listen 메소드의 기본 구조

stream.listen(
  (data) {
    // 데이터 이벤트 (기본 이벤트)
  },
  onError: (error) {
    // 에러 이벤트
  },
  onDone: () {
    // 완료 이벤트
  },
  cancelOnError: false, // 에러 발생 시 스트림을 자동으로 취소할지 여부
);
  • data: 스트림에서 새로운 데이터 이벤트가 발생할 때 호출되는 콜백 함수, 스트림의 각 데이터 이벤트는 이 콜백 함수에 전달된다.
  • onError: 스트림에서 에러 이벤트가 발생할 때 호출되는 콜백 함수, 이 함수를 통해 발생한 에러를 처리할 수 있다.
  • onDone: 스트림이 완료되었을 때 호출되는 콜백 함수, 더 이상 데이터나 에러 이벤트가 발생하지 않음을 나타낸다.
  • cancelOnError: 이 옵션이 true로 설정되면, 에러 이벤트가 발생했을 때 스트림의 구독이 자동으로 취소된다. 기본값은 false.
void main() {
  // StreamController로 스트림 생성
  StreamController<int> controller = StreamController<int>();

  // listen 메소드로 스트림 구독
  controller.stream.listen(
    (data) {
      print('Data received: $data');
    },
    onError: (error) {
      print('Error occurred: $error');
    },
    onDone: () {
      print('Stream is done.');
    },
    cancelOnError: true, // 에러 발생 시 구독을 자동으로 취소
  );

  // 스트림에 데이터 추가
  controller.add(1);
  controller.add(2);
  controller.addError('An error occurred!');
  controller.add(3); // 이 이벤트는 cancelOnError가 true라서 호출되지 않음

  // 스트림을 종료
  controller.close();
}
# 결과
Data received: 1
Data received: 2
Error occurred: An error occurred!

 

controller.add(1)controller.add(2) : data 콜백이 호출되어 해당 데이터가 출력된다.
controller.addError('An error occurred!') : onError 콜백이 호출되어 에러가 출력된다.
cancelOnError: true : 에러 발생 후 스트림의 구독이 취소되고, 이후 추가된 3은 출력되지 않는다.
onDone : 스트림이 종료되면 콜백이 호출됩니다.