[Dart] Stream

728x90

 

Async Programming에서 사용되는 기법

함수를 닫아주는 순간(완료 되는 순간)까지 계속 리턴 값을 받을 수 있다.

 

1. 스트림 사용 방법 

import 'dart:async';

void main() {
  //스트림 가져오기
  final controller = StreamController();
  final stream = controller.stream;

  //스트림이 listen하고 있을 때 값을 받는다.
  final streamListener1 = stream.listen((val) {
    //값이 들어오면 실행 될 함수
    print('리스너1 :: $val');
  });

  controller.sink.add(1);
}

 

 

2. 스트림 여러번 리스닝 하는 방법

void main() {
  //스트림 가져오기
  final controller = StreamController();
  //한 번만 리스닝 할 때
  //final stream = controller.stream;

  //여러번 리스닝 할 때
  final stream = controller.stream.asBroadcastStream();

  //스트림이 listen하고 있을 때 값을 받는다.
  final streamListener1 = stream.listen((val) {
    //값이 들어오면 실행 될 함수
    print('리스너1 :: $val');
  });

  final streamListener12 = stream.listen((val) {
    print('리스너2 :: $val');
  });

  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
}

 

 

3. 즉석에서 Stream 값 변경하기 (조건 주기)

  //스트림이 listen하고 있을 때 값을 받는다.
  final streamListener1 = stream.where((val) => val % 2 == 0).listen((val) {
    //값이 들어오면 실행 될 함수
    print('리스너1 :: $val');
  });

  final streamListener12 = stream.where((val) => val % 2 == 1).listen((val) {
    print('리스너2 :: $val');
  });

 

 

4. 함수로 Stream 을 제공하는 방법

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

Stream<int> cal(int number) async* {
  for (int i = 0; i < 5; i++) {
    //yield 가 실행 할 때마다 cal 함수를 리스닝하고 있는 리스너에 값을 뿌려줌
    yield i * number;
  }
}

 

await를 쓸 때

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

  cal(4).listen((val) {
    print('cal 4 :: $val');
  });
}

Stream<int> cal(int number) async* {
  for (int i = 0; i < 5; i++) {
    //yield 가 실행 할 때마다 cal 함수를 리스닝하고 있는 리스너에 값을 뿌려줌
    yield i * number;

    await Future.delayed(Duration(seconds: 1));
  }
}

 

5. 함수 실행이 끝날때까지 기다리기 

await와 같은 기능 

void main() {
  playAllStream().listen((val) {
    print(val);
  });
}

Stream<int> playAllStream() async* {
  //yield : 순서대로
  //yield* : 첫 번째 함수가 값이 다 받아와질 때까지 기다림
  yield* cal(1);
  yield* cal(1000);
}

728x90

'Flutter' 카테고리의 다른 글

[Dart] Async Programming 비동기 프로그래밍  (0) 2024.07.25
[Dart] where절과 reduce, fold  (0) 2024.07.17
[Dart] mapping  (0) 2024.07.17
[Dart] List를 Map 혹은 Set으로 변환하기  (0) 2024.07.17
[Dart] function  (0) 2024.06.12