개발자가 되고 싶은 개발자

Dart 비동기 프로그래밍 (Future, async, await, stream) 본문

Dev/Flutter

Dart 비동기 프로그래밍 (Future, async, await, stream)

Fullth 2024. 4. 2. 22:40

Future

Future라는 미래에 받을 값들에 대해서 받을 수 있는 생소한 키워드가 존재한다.

자바에서도 비동기 프로그래밍에서 사용하는 키워드이다.

지금까지 본 결과 TypeScript와 Java의 장점이 합쳐진 언어로 보인다.

void main() {
  Future<String> name = Future.value('Genesis');
  Future<int> serial = Future.value(80);
  Future<bool> isMine = Future.value(true);
}

setTimeout과 같은 역할을 아래 문법으로 사용할 수 있다.

  Future.delayed(Duration(seconds: 2), () {
    print('딜레이 종료');
  });

 

 

비동기 프로그래밍: futures, async, await

DartPad로 비동기 코드를 작성법을 배우고 연습해봅시다!

dart-ko.dev

 

async / await

자바스크립트에서 async 함수가 Promise를 반환하는 것처럼 다트도 Future를 반환한다.

main에서 여러 번 호출하고 싶다면, 아래 sum 함수가 void가 아닌 Future<void>로 수정해야 한다.

void main() {
  sum(10, 90);
}

void sum(int a, int b) async {
  print('Start');
  
  await Future.delayed(Duration(seconds: 2), () {
    print(a + b);
  });
  
  print('End');
}

 

Stream

Dart에서 기본적으로 제공하지 않아 import를 통해서 사용할 수 있음

StreamController를 사용할 수 있음.

자바스크립트와 다르게 별도 as 없이 모듈시스템을 import만 하면 사용할 수 있음.

import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream;
  
  final stramListener1 =stream.listen((val) {
    print('L1: $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
}

// output
L1: 1
L1: 2
L1: 3
L1: 4
L1: 5

 

Broadcast

하나의 컨트롤러로 여러 개 작업을 브로드 캐스트 할 수 있다

아직 와닿지는 않지만, 나눠져 있는 컴포넌트에서 활용할 수 있을 것으로 보인다 

import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  final stramListener1 =stream.listen((val) {
    print('L1: $val');
  });
  
  final stramListener2 =stream.listen((val) {
    print('L2: $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
}

// output
L1: 1
L2: 1
L1: 2
L2: 2
L1: 3
L2: 3
L1: 4
L2: 4
L1: 5
L2: 5

 

Litener별로 출력값 조정

import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  final stramListener1 =stream.where((val) => val % 2 == 0).listen((val) {
    print('L1: $val');
  });
  
  final stramListener2 =stream.where((val) => val % 2 == 1).listen((val) {
    print('L2: $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
}

// output
L2: 1
L1: 2
L2: 3
L1: 4
L2: 5

 

Stream 함수로 사용

import 'dart:async';

void main() {
  calculate(2).listen((val) {
    print(val);
  });
}

Stream<int> calculate(int num) async* {
  for(int i = 1; i <= 5; i++) {
    yield i * num;
  }
}

 

이전 포스팅 참고

기본 문법

 

Dart 기본 문법 빠르게 정리

배열의 인덱스에 접근하는 방법과 같이 프로그래밍 언어의 일반적인 사항은 작성하지 않음. Dart 언어 소개 Dart 프로그램과 주요 개념에 대한 간결한 소개. dart-ko.dev main 최상위 main 함수를 갖음출

fullth.tistory.com

클래스와 인터페이스

 

Dart 클래스와 인터페이스

Dart 기본 문법 정리에 이어 Dart에서 Class를 어떻게 사용하는지 정리한다 Dart 기본 문법 빠르게 정리 배열의 인덱스에 접근하는 방법과 같이 프로그래밍 언어의 일반적인 사항은 작성하지 않음. Da

fullth.tistory.com

 

'Dev > Flutter' 카테고리의 다른 글

Flutter 설치 (mac)  (0) 2024.04.03
Dart 클래스와 인터페이스  (0) 2024.03.31
Dart 기본 문법 빠르게 정리  (0) 2024.03.30