- Future는 미래에 받아올 값이다.
Future<String> name = Future.value('쩡이');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
- delayed는 2개의 파라미터를 받는다.
- 1번 파라미터 - 지연할 기간 (얼마나 지연할건지) Duration
- 2번 파라미터 - 지연 시간이 지난 후 실행할 함수
Future.delayed(Duration(seconds: 2), (){
print('Delay 끝');
});
- 동기 코드 예시
void main() {
addNumbers(1, 1);
addNumbers(2, 2);
}
void addNumbers(int number1, int number2) {
print('계산중: $number1 + $number2');
print('계산 완료: ${number1 + number2}');
}
계산중: 1 + 1
계산 완료: 2
계산중: 2 + 2
계산 완료: 4
- 비동기 코드 예시
void addNumbers(int number1, int number2){
print('계산 시작 : $number1 + $number2');
// 서버 시뮬레이션
Future.delayed(Duration(seconds: 2), (){
print('계산 완료: $number1 + $number2 = ${number1 + number2}');
});
print('함수 완료');
}
// addNumbers(1,1)을 실행했을 때
계산 시작 : 1 + 1
함수 완료
계산 완료: 1 + 1 = 2
- async-await를 통해 코드실행 순서를 로직대로 진행할 수 있다.
- await는 Future를 리턴해주는 함수에만 가능
void addNumbers(int number1, int number2) async {
print('계산 시작 : $number1 + $number2');
// 서버 시뮬레이션
await Future.delayed(Duration(seconds: 2), (){
print('계산 완료: $number1 + $number2 = ${number1 + number2}');
});
print('함수 완료');
}
- await를 사용하면 순서대로 실행, 현재코드가 완전히 끝날때까지 다음코드 실행X
- 기다리는 동안 cpu가 다른 작업이 가능하다. (다음줄 코드)
void main() {
// Future - 미래
// 미래에 받아올 값
Future<String> name = Future.value('쩡이');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
addNumbers(1,1);
addNumbers(2,2);
}
void addNumbers(int number1, int number2) async {
print('계산 시작 : $number1 + $number2');
// 서버 시뮬레이션
await Future.delayed(Duration(seconds: 2), (){
print('계산 완료: $number1 + $number2 = ${number1 + number2}');
});
print('함수 완료');
}
계산 시작 : 1 + 1
계산 시작 : 2 + 2
계산 완료: 1 + 1 = 2
함수 완료
계산 완료: 2 + 2 = 4
함수 완료
- Future await는 모든 함수에서 적용이 가능하다. (아래 예시 참조)
void main() async{
await addNumbers(1,1);
await addNumbers(2,2);
}
Future<void> addNumbers(int number1, int number2) async {
print('계산 시작 : $number1 + $number2');
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: $result2');
print('result1 + result 2 = ${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('함수 완료');
return number1 + number2;
}
- Future에서 await 키워드를 통해서 값을 기다릴 수 있다.
- Future의 특징은 한 함수에서 하나의 값만 반환 할 수 있다는 점이다.
- Future는 함수가 끝날때가 완료시점이지만, Stream은 직접 값을 받는 시점이 완료시점이다.
- Stream을 닫을때까지, yield 키워드를 사용해 값을 계속 반환 받을 수 있다.
- Stream 사용 예시
import 'dart:async';
void main() async{
final controller = StreamController();
final stream = controller.stream;
// 값이 들어오면 함수가 실행됨
final streamListner1 = stream.listen((val) {
print('Listener 1 : $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
}
Listener 1 : 1
Listener 1 : 2
Listener 1 : 3
- .asBroadcastStream() 을 통해 여러개의 리스너를 설정 가능하다.
import 'dart:async';
void main() async{
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final streamListner1 = stream.listen((val) {
print('Listener 1 : $val');
});
final streamListner2 = stream.listen((val) {
print('Listener 2 : $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
}
Listener 1 : 1
Listener 2 : 1
Listener 1 : 2
Listener 2 : 2
Listener 1 : 3
Listener 2 : 3
- 짝수 / 홀수 리스너 예시
import 'dart:async';
void main() async{
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final streamListner1 = stream.where((val) => val % 2 ==0).listen((val) {
print('Listener 1 : $val');
});
final streamListner2 = stream.where((val) => val % 2 ==1).listen((val) {
print('Listener 2 : $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
}
Listener 2 : 1
Listener 1 : 2
Listener 2 : 3
- Stream-async* 사용예시
import 'dart:async';
void main() async{
calculate(1).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));
}
}
//calculate(1)에서 await를 했을때, calculate(4) 실행. (비동기프로그래밍)
calculate(1) : 0
calculate(4) : 0
calculate(1) : 1
calculate(4) : 4
calculate(1) : 2
calculate(4) : 8
calculate(1) : 3
calculate(4) : 12
calculate(1) : 4
calculate(4) : 16
- stream에서도 await와 같은 기능을 구현할 수 있다.
- yield*은 stream의 모든 값을 다 받아올 때까지 기다린다.
import 'dart:async';
void main() async{
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));
}
}
0
1
2
3
4
0
1000
2000
3000
4000
'Flutter' 카테고리의 다른 글
[Flutter] row and column (0) | 2023.09.22 |
---|---|
[Flutter] Splash Screen (0) | 2023.09.22 |
[Dart] Dart 함수형 프로그래밍 (Functional Programming) (0) | 2023.09.19 |
[Dart] Dart 객체지향 프로그래밍 (Object Oriented Programming) (0) | 2023.09.18 |
[Dart] Dart 기본 문법 (0) | 2023.09.13 |