- [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 |