Flutter & Dart

플러터 스트림

코딩하는후운 2022. 10. 22. 19:14
반응형


스트림은 데이터나 이벤트가 들어오는 통로다.
비동기 작업을 할 떄 주로 쓰인다.

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

 

 

반응형