반응형
스트림은 데이터나 이벤트가 들어오는 통로다.
비동기 작업을 할 떄 주로 쓰인다.
1초마다 데이터를 만드는 스트림이다.
void main(){
var stream = Stream.periodic(Duration(seconds: 1), (x) => x.take(10);
//1초마다 데이터를 1개씩 만듬, 10개 까지만.
stream.listen(print); //이벤트 처리
}
스트림은 항상 만들기 -> 연결(listen) -> 데이터 처리의 과정을 거친다.
Stream - 여러 방법으로 스트림 만들기
즉시 만들거나, 일정 시간마다 만들거나, 퓨처를 써서 만들 수 있다.
void main(){
Stream.fromIterable([1,2,3,4,5]) //일반적인 데이터를 다룰 때
.listen((int x) => print('iterable : ${x}'));
Stream.periodic(Duration(seconds: 1), (x) => x) //1초에 1번씩 동작
.take(5) //5개까지만 데이터를 처리함.
.listen((x) => print('take : ${x}'));
Stream.fromFuture(getData()) //비동기 데이터를 처리할 때
.listend((x) => print('from Future : ${x}'));
}
Future<String> getData async{
await Future.delayed(Duration(seconds: 5)); //5초간 대기
print("Fetched Data");
return "5초 기다렸다가 온 데이터 입니다.";
}
Stream - 처음 끝의 데이터만 사용하기
var stream = Stream.fromIterable([1,2,3,4,5]);
stream.first.then((value)=> print("stream.first: $value")); //가장 앞의 데이터만 가져온다.
stream.last.then //가장 마지막의 데이터만 가져옴.
stream.isEmpty.then //비어있는지 확인 - false
stream.length.then //전체길이 5
-의문
stream.first를 실행하고 stream.last를 바로 실행할 수는 없을까?
안된다. 스트림은 기본적으로 싱글 서브스크립션이다.
싱글 서브스크립션은 한군데서만 리슨할 수 있다.
여러군데서 리슨하려면 브로드캐스트로 변경해줘야한다.
Stream - 스트림 변경, StreamTransformer
map을 쓰면 스트림을 어느정도 변경할 수는 있다.
var streamMap = Stream.periodic(Duration(milliseconds: 200), (x) => x).take(3).map((x) => x + 10);
streamMap.listen(print)
하지만 map으로는 복잡한 처리를 하기 힘들다.
StreamTransformer를 쓰면 스트림을 변경해 쓰기에 좋다.
var transformer = new StreamTransformer.fromHandlers(handleData: (value, sink){
sink.add("First: $value"); //Stream Sink는 스트림 이벤트를 받아들이는 곳이다.
sink.add("Second: $value");
});
var stream = Stream.fromIterable(["good", 1,2,3,4,5]);
stream.transform(transformer).listen((value) => print("listen : $value"));
참조 :
https://software-creator.tistory.com/9?category=681555
반응형
'Flutter & Dart' 카테고리의 다른 글
[Flutter] Screen Naviation | 화면(라우트)간 이동 (0) | 2022.10.22 |
---|---|
플러터 튜토리얼 앱 (0) | 2022.10.22 |
플러터 커스텀 위젯 추가 (0) | 2022.10.22 |
[Flutter] 플러터에 대해 알아보자 (0) | 2022.10.20 |
다트 기본 문법 (0) | 2022.10.20 |