DAMPER's blog

1.4 Dart 스트림 통신하기 본문

Flutter

1.4 Dart 스트림 통신하기

DAMPER 2022. 2. 12. 01:01
728x90

다음 내용은 'Doit! 플러터 앱 프로그래밍' 책 내용을 정리한 내용입니다.

 

 

 

데이터를 순서대로 주고받을 것으로 생각해서 화면을 구성했는데 네트워크나 와이파이 연결이 끊기거나 특정 API 호출이 늦어져 순서가 달라지면 원하는 흐름대로 작동시킬 수 없다.

데이터를 순서대로 주고받아야 할 때 순서를 보장받기위해 스트림을 사용한다.

스트림은 처음에 넣은 데이터가 꺼낼 때도 가장 먼저 나오는 데이터 구조로 생각할 수 있다.

 

import 'dart:async';

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for(var value in stream) {
    print('sum Stream : $value');
    sum += value;
  }
  return sum;
}

Stream<int> countStream(int to) async* {
  for(int i=1;i<=to;i++){
    print('countStream : $i');
    yield i;
  }
}

void main() async {
  var stream = countStream(10);
  var sum = await sumStream(stream);
  print(sum);
}

async* 는 앞으로 yield를 이용해 지속적으로 데이터를 전달하겠다는 의미이다.

위 코드에서 yield는 int형 i를 반환하는데, return은 한 번 반환하면 함수가 끝나지만 yield는 반환 후에도 계속 함수를 유지한다.

yield 값을 인자로 sumStream() 함수를 호출하면 이 값이 전달될 때마다 sum 변수에 누적해서 반환해 준다.

그리고 main() 함수에서 이 값을 받아서 출력하면 55가 나온다.

 

 

또 다음처럼 then() 함수를 이용해 스트림 코드를 작성할 수 있다.

void main() {
  var stream = Stream.fromIterable([5, 4, 3, 2, 1]);

  //stream.first.then((value) => print('first: $value'));
  //stream.last.then((value) => print('last: $value'));
  //stream.isEmpty.then((value) => print('isEmpty: $value'));
  stream.length.then((value) => print('length: $value'));
}

Stream 클래스를 이용해 배열을 하나 만든 후 함수를 이용해서 값을 가져온다.

그런 다음 then() 함수로 가져다 사용한다.

하지만 스트림을 통해 데이터를 사용하면 데이터는 사라지기 때문에 한 번만 실행하도록 한다.

 

스트림은 실시간으로 서버를 살펴보다가 서버에서 데이터가 변경되면 화면을 새로고침하지않더라도 자동으로 변경된 데이터가 반영되어야 할 때 사용할 수 있는 유용한 클래스이다.

 

 

 

728x90

'Flutter' 카테고리의 다른 글

2-2. Flutter 프로젝트 기본 구조 2  (0) 2022.02.14
2-1. Flutter 프로젝트 기본 구조  (0) 2022.02.12
1.3 Dart으로 JSON 데이터 주고받기  (0) 2022.02.11
1-2. Dart 비동기 처리  (0) 2022.02.11
1-1. Dart  (0) 2022.02.11