[Flutter/Dart] flutter Stream 이란 무엇인가

houndhollis·2023년 11월 13일
2
post-thumbnail

월요일 오늘도 날씨가 너무 차다 모자 안달린 옷을 입고 싶은데, 아침에 버스에 내려서 모자를 안쓰면 진짜 너무 추운거 같아서 모자 달린 옷을 포기 못하고 출근하고 있다 !.. TMI,,

Stream

간단하게 Future 같은 경우 함수가 끝나는 순간이 완료 순간인데.
Stream 같은 경우는 직접적으로 닫아주는 순간이 완료순간이다.

  • 지속적으로 값을 받는다.
import 'dart:async';

void main () {
   final controller = StreamController();
   final stream = controller.stream;
   
  -- 초기 셋팅은 이렇게 된다. --
  
   final streamListener = stream.listen((val) {
   	 print('Listener 1: $val' );
   });
  	
   controller.sink.add(1);
   controller.sink.add(2);
   
   -> add 라는 함수를 통해 listen한테 전달이 된다.
}

우선 import를 해줘야 stream 을 사용 할 수있다.

결과값

Listener 1: 1
Listener 1: 2

controller.sink.add()함수를 통해 listen 한테 값 전달 가능,
가장 기본적인 형태이다.

stream, asBroadcastStream()

우리는 Stream 을 여러번 하는 경우가 생길수도 있다.
그러한 방법이다.

import 'dart:async';

void main() {
  
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  
  final streamListener1 = stream.listen((val){
    print('Listener 1: $val' );
  });
  
  final streamListener2 = stream.listen((val){
    print('Listener 2: $val' );
  });
  
----------------호출 부-----------------
  controller.sink.add(1);
  controller.sink.add(2);
}

결과값

Listener 1: 1
Listener 2: 1
Listener 1: 2
Listener 2: 2

controller.stream 을 가져오면 기본적으로 한번만 리스닝을 할수있는 리소스가 생긴다 뒤에 .asBroadcastStream()을 붙여준다.

하지만 여기서 추가로 함수형 프로그래밍으로도 사용이 가능하다.

final streamListener3 = stream.where((val) => val % 2 == 0).listen((val){
	print('streamListener3: $val')
})

--------결과 값 -----------
streamListener3: 2
streamListener3: 4

위에 호출부를 사용한 결과값이다.

항상 데이터가 들어오는 순간에 변형을 주거나 데이터를 다룰수 있다는 거를 기억해야 한다.

Stream async

import 'dart:async';

void main() {
  calculate(1).listen((val) {
    print('result1 : $val');
  });
}

Stream<int> calculate(int number) async* {
  for(int i = 0; i< 5; i++) {
    yield i * number;
    
    // return 을 하면 종료가 되기 때문에 yield로 표기해준다.
    // 추가로 await 쓰는방법,
    
    await Future.delayed(Duration(seconds : 1));
  }
  // 위에 결과값이 1초씩 기다려진다.
}

결과값

1초에 한번씩 print 가 되며,
result1 : 0
result1 : 1
result1 : 2
result1 : 3
result1 : 4

반복 문을 돌며 실행된 결과값이다.

Stream 에서도 await 사용할수 있다.

void main() {
  playAllStream().listen((val) {
    print('결과 값: $val');
  });
}

Stream<int> playAllStream() async* {
  yield* calculate(1);
  yield* calculate(1000);
}

Stream<int> calculate(int number) async* {
  for(int i = 0; i < 5; i++) {
    yield i * number;
    
    await Future.delayed(Duration(seconds : 1));
  }
}

결과값

결과 값: 0
결과 값: 1
결과 값: 2
결과 값: 3
결과 값: 4
결과 값: 0
결과 값: 1000
결과 값: 2000
결과 값: 3000
결과 값: 4000

이상으로 다트 언어에 대해 정리 해봤다 조만간 3.0 이상 문법에 대해 다룰거 같긴 한데. 당분간은 복습을 하고 이제 슬슬 위젯 다루는 것을 작성해볼까 한다.

profile
한 줄 소개

0개의 댓글