Dart 4 비동기 프로그래밍

2022. 10. 3. 20:46프로그래밍 언어/Flutter

https://www.inflearn.com/course/%ED%94%8C%EB%9F%AC%ED%84%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/unit/105778

 

Dart 언어는 Asychoronous Programming 이다. 

Future 지연 함수

void main() {
// Future - 미래 
// 미래에 받아올 값 
addNumbers(1,1);
  
}

void addNumbers(int number1 , int number2){
  print('계산 시작: $number1 + $number2');
  
  // 2개의 파라미터 
  // delayed -지연되다.
  // 1번 파라미터 - 지연할 시간 (얼마나 지연할건지) Duration
  // 2번 파라미터 - 지연시간이 지난 후 실행할 함수 
  Future.delayed(Duration(seconds: 2),(){
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });
  
  print('함수 완료');
}

메소드에 await 쓰는법 

함수에 async 키워드를 써줘야 await 를 쓸 수있다. 

await : 순서대로 실행 하도록 만드는 키워드 

void main() {
addNumbers(1,1);
addNumbers(2,2);
}

// await 현재 코드가 끝나기 전에 다음코드를 실행하지마세요. 
// await 는 Future 를 리턴해주는 함수만 가능 

void addNumbers(int number1 , int number2) async {
  print('계산 시작: $number1 + $number2');
  
  // 2개의 파라미터 
  // delayed -지연되다.
  // 1번 파라미터 - 지연할 시간 (얼마나 지연할건지) Duration
  // 2번 파라미터 - 지연시간이 지난 후 실행할 함수 
  await Future.delayed(Duration(seconds: 2),(){
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });
  
  print('함수 완료');
}

함수에 await 쓰는법 

void main() async{
 
await addNumbers(1,1);
await addNumbers(2,2);
}
// 함수 자체를 await 쓰려면,
// 1.리턴값을 Future 로 바꿔줘야한다.
// 2. main 에 async 키워드
// 3. 함수에 await 키워드 
Future <void> addNumbers(int number1 , int number2) async {
  print('계산 시작: $number1 + $number2');
  
  // 2개의 파라미터 
  // delayed -지연되다.
  // 1번 파라미터 - 지연할 시간 (얼마나 지연할건지) Duration
  // 2번 파라미터 - 지연시간이 지난 후 실행할 함수 
  await Future.delayed(Duration(seconds: 2),(){
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });
  
  print('함수 완료');
}

Future로 리턴하기 

void main() async{
// Future - 미래 
// 미래에 받아올 값 
Future<String> name =Future.value('코드팩토리');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
  
final result1 = await addNumbers(1,1);
final result2 = await addNumbers(2,2);
  
print('result1 : $result1');  
print('result1 : $result1'); 
print('result1 + result2 = ${result1 + result2}'); 
}

Future <int> addNumbers(int number1 , int number2) async {
  print('계산 시작: $number1 + $number2');
  
  await Future.delayed(Duration(seconds: 2),(){
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });
  
  print('함수 완료');
  // 자동으로 Future 에 말아서 리턴해준다.  
  return number1+ number2;
}

import 'dart:async';
void main() {
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  final streamListener1 = stream.where((val) => val %2 ==0).listen((val) {
     print('Listener 1 : $val');   
  });
   final streamListener2 = stream.where((val) => val %2 ==1).listen((val) {
     print('Listener 2 : $val');   
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);  
}

 

import 'dart:async';
void main() {
  calculate(2).listen((val){
    print('calculate(2): $val');
  });
  calculate(4).listen((val){
    print('calculate(4): $val');
  });
 
}

Stream<int> calculate(int number) async* {
  for(int i=0; i< 5 ; i++){
    yield i* number;
    
    await Future.delayed(Duration(seconds: 1));
  }
}

각 stream 은 동시에 진행되는 걸로보아 비동기로 작동하는걸 볼수있음.

한 스트림이 끝나고 다음 스트림으로 넘어가는법 : yield* 

import 'dart:async';
void main() {
  playAllStream().listen((val){
    print(val);
  });
 
}


//yield* 은 모든값을 가져와야 다음으로 넘어감.
Stream<int> playAllStream() async*{
  
  yield* calculate(1);
  yield* calculate(1000);
  
}

Stream<int> calculate(int number) async* {
  for(int i=0; i< 5 ; i++){
    yield i* number;
    
    await Future.delayed(Duration(seconds: 1));
  }
}

'프로그래밍 언어 > Flutter' 카테고리의 다른 글

[Flutter] Row and Column  (0) 2022.10.13
INSTALL_FAILED_INSUFFICIENT_STORAGE 해결법  (0) 2022.10.10
Dart 3 함수형 프로그래밍  (0) 2022.10.03
Dart 2 객체지향 프로그래밍  (0) 2022.10.02
Dart 언어 기본기  (0) 2022.10.02