[Flutter] Stream 사용법

2020년 10월 04일 by 진아사랑해

    [Flutter] Stream 사용법 목차
반응형

제공자로 부터 지속적으로 데이터를 받아야 하는 경우에 사용한다.

Future가 한개의 데이터를 받는 것이라면 Stream은 n-개를 받을 수 있는 통로이다.

 

1. stream으로 데이터를 받는 경우

 

import 'dart:async';

 

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for(var value in stream) {  //async & await임으로 for문이 모두 수행될 때까지 기다린다.
    print(sum);       // 1초 마다 stream으로 전달받은 값과 sum을 출력한다. (0, 1, 3, .. 45)를 출력한다
    sum += value;
  }
  return sum;
}

 

Stream<int> countStream(int to) async* {    //stream을 사용하는 경우에는 async*를 사용한다.
  for(int i = 1; i <= to; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;      // <= 이 문장이 실행될 떄마다 i값을 stream에 return 값을 던져준다 
  }
}

 

main() async {
  var stream = countStream(10);
  var sum = await sumStream(stream);
  print(sum);       // 55를 출력한다.

}

 

2. stream으로 데이터가 전달되는 것을 확인할 때 (stream.listen() 사용)

   
main() async {
  var stream = countStream(10);
  stream.listen((value) =>{
    print("current value: "+value.toString())   // current value 1 ~ 10까지 출력된다
  });
}

 

3. stream안에서 data manipulation (데이터 조작) 하는 경우

 

var transformer = new StreamTransformer<int, 

  String>.fromHandlers(handleData: (value, sink){     //sink는 stream의 입구이다. 입구에 value를 넣어주는 것이다

    sink.add("value": $value");

});

 

main() async { 
  var stream = countStream(10); 
  stream.transform(transformer).listen((value) =>{
    print(value)   // value 1 ~ 10까지 출력된다
  }); 
}

 

4. Error 처리

  Uncaught Error: Exception: Intentional Error 가 나오는 이유를 모르겠다

 

5. Broadcast stream

   원하는 모든 곳에 stream을 통해 값을 전달한다.

 

main() async { 
  var stream = countStream(10); 

  var bcStream = stream.asBroadcastStream();   

  bcStream.listen((value) => {   <= 스트림을 listen

    print("again $value")

  });
  var sum = await sumStream(bcStream); <= 스트림을 sumStream으로 넘김
  print(sum); 

}

 

참조영상: www.youtube.com/watch?v=AKOUDHZsBP0

 

반응형

'flutter' 카테고리의 다른 글

Dart map() 함수 & ... 함수  (0) 2020.10.07
[Flutter] BuildContext  (0) 2020.10.04
[Flutter] Future async & await 사용법  (0) 2020.10.04
[Flutter] ChangeNotifier provider 사용법  (0) 2020.10.03
[Flutter] CustomPaint 사용법  (0) 2020.10.02