Flutter(플러터)

Dart #4 비동기 프로그래밍(Async Programming)

백코딩 2023. 9. 18. 17:23
728x90
void main() async{
  //Future - 미래
  // 미래에 받아올 값
  
  Future<String> name = Future.value('하하호호');
  Future<int> number = Future.value(1);
  Future<bool> isTrue = Future.value(true);
  
  await addNumber(1, 1);
  await addNumber(2, 2);
  
}


Future<void> addNumber(int number1, int number2) async {
  print("계산 시작 : $number1 + $number2");
  
  // 서버 시뮬레이션
  await Future.delayed(Duration(seconds: 2), (){
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });
  
  print('함수 완료');
}

Future

- Future는 다트에서 비동기 작업을 나타내는 클래스입니다. 이것은 어떤 값이나 오류를 '미래에'반환할 수 있는 객체를 나타냅니다. Future는 한 번 결정되면 변경할 수 없습니다.

- Future.value 생성자를 사용하여 즉시 결정된 미래 값을 생성하고 있습니다.

 

Duration

- Duration 클래스는 시간 간격을 나타냅니다. 여러 시간 단위(일, 시간, 분, 초, 밀리촌, 마이크로초)를 사용하여 간격을 나타낼 수 있습니다.

 

delayed

- Future.delayed는 지정된 지연이 경과한 후에 값을 계산하는 미래를 생성합니다.

 

seconds

- seconds는 Duration 생성자에서 사용되는 명명된 매개변수 중 하나입니다.

 

 

async

- async 키워드는 함수가 비동기로 실행될 수 있음을 나타냅니다. async가 표기된 함수는 항상 Future를 반환합니다. 심지어 반환 유형이 void인 경우에도, 그것은 실제로 Future<void>를 반환합니다.

 

await

- await 키워드는 async 함수 내에서 사용되며, Future가 완료될 때까지 기다립니다. 이렇게 하면 Future의 결과를 마치 동기 코드처럼 읽을 수 있게 됩니다.

- await 표현식 자체는 Future를 반환하므로, 일반적으로 await 키워드는 async 함수 내에서만 사용됩니다.

 

 

import 'dart:async';

void main(){
  final controller = StreamController();
  final stream = controller.stream;
  
  
  final streamListener1 = stream.listen((val){
    print('Listener 1 : $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(){
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  
  final streamListener1 = stream.listen((val){
    print('Listener 1 : $val');
  });
  
  final stemListener2 = stream.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(){
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  
  final streamListener1 = stream.where((val) => val % 2 == 0).listen((val){
    print('Listener 1 : $val');
  });
  
  final stemListener2 = 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(1) : $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));
  }
}
import 'dart:async';

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


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));
  }
}

// stream은 더 좋은 라이브러리가 있으니 너무 걱정하지 않아도 됩니다.

728x90