Dart 언어에서 비동기 프로그래밍을 위해 Future객체와 async와 await 키워드를 사용합니다. 즉, 특정 요청에 대해서 비동기적으로 수행하고 응답을 기다릴 때 async와 await를 사용할 수 있습니다.
비동기 함수로 정의하기 위해서는 함수명 뒤에 async 키워드 붙이면 됩니다. 비동기 작업을 수행하는 부분에는 await 키워드를 사용함으로써, 해당 작업이 완료될 때까지 대기하게 정의할 수 있습니다.
Future<void> futureFileCopy(String source, String target) async {
final sourceFile = File(source);
try {
String data = await File(source).readAsString();
if (data.contains(validName)) {
data = data.replaceAll(validName, changedName);
}
await File(target).writeAsString(data);
} on FileSystemException catch (e) {
print(e.toString());
}
}
위의 futureFileCopy 함수는 비동기 함수로 정의되었습니다. File객체를 활용하여 source의 데이타를 target에 write하도록 구현되어 있으며, await 키워드를 사용함으로써 해당 기능을 수행이 완료되어 응답이 올 때까지 대기를 한 후에 다음 로직을 수행합니다.
또한, 통신에서 많은 데이터를 Json으로 사용되어지는데요? 이때에도 await 을 활용하여 비동기적으로 처리 할 수 있습니다.
Future<String> getMovieInfo() async {
await Future.delayed(Duration(seconds: 2));
final mockData = {
'title': 'Star Wars',
'director': 'George Lucas',
'year': 1977,
};
void main() async {
final String movieInfo = await getMovieInfo();
print(MovieInfo.fromMap(jsonDecode(movieInfo)).director);
// Same Result
print(jsonDecode(await getMovieInfo())['director']);
}
위의 코드는 간단하게 Future<String> 으로 결과를 돌려받습니다. 이때에도 비동기적으로 리턴값을 활용해야 하므로 await키워드를 적어주어야 하며, void main() 에서 받기에 여기에도 async키워드를 추가해 주어야 합니다.
해당 리턴 값을 마냥 기다릴 수 없는 상황에서는 시간 제한을 주어 활용할 수 있습니다.
void main() async {
try {
final String result = await timeoutFuture().timeout(const Duration(seconds: 5));
} on TimeoutException catch (e) {
print(e.toString());
}
}
위의 코드는 비동기 main() 함수로서 5초 이상의 시간이 걸릴 경우에 timeout()을 수행되도록 하는 코드로서, 해당 작업 수행에 제한 시간 이상의 시간이 걸릴 경우 TimeoutException 으로 예외를 처리할 수 있도록 구현되어 있습니다. 그리고 아래의 출력은 시간 제한을 초과하였을 때의 결과입니다.
TimeoutException after 0:00:05.000000: Future not completed
이렇게 Dart언어에서 비동기 프로그래밍을 활용할 수 있으며, 응답을 기다리는 동안 다른 작업을 수행할 수 있습니다.
'Dart, Flutter for App' 카테고리의 다른 글
구글 플레이 콘솔 - 플러터 앱 비공개 테스트 중 업데이트 하기 (7) | 2024.02.17 |
---|---|
Dart - 컬렉션(List, Map, Set)+Dynamic 타입 (1) | 2024.02.07 |
Dart - 직렬화 json_serializable (0) | 2024.02.07 |
Flutter Package : Animated_Tree_View 활용 (1) | 2024.01.31 |
Flutter Error | Error (Xcode): expected a ‘=’, but found ? (0) | 2024.01.06 |