Flutter는 비동기 작업을 수행하기 위해 Future 객체를 사용합니다. 하지만 Future 객체만으로는 비동기 작업을 효율적으로 처리하기 어렵습니다. 이때 Async/Await를 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다. 이번에는 Flutter에서 Async/Await를 사용하는 방법에 대해 알아보겠습니다.
Async 함수란?
Async 함수는 비동기 작업을 수행하기 위한 함수입니다. Async 함수는 함수의 반환값 앞에 async 키워드를 붙여서 선언합니다. 예를 들어, 다음과 같이 Future를 반환하는 Async 함수를 선언할 수 있습니다.
Future<String> fetchData() async {
// 비동기 작업 수행
}
Await 키워드란?
Await 키워드는 Async 함수 내에서 Future 객체가 완료될 때까지 대기하는 역할을 합니다. Await 키워드를 사용하면 Future 객체가 완료될 때까지 다음 코드로 진행하지 않고, 해당 Future 객체가 완료될 때까지 대기합니다.
Future<String> fetchData() async {
String result = await http.get(url);
return result;
}
위 예제에서는 http.get() 메소드를 사용해 비동기적으로 데이터를 가져옵니다. await 키워드를 사용하면 http.get() 메소드가 반환하는 Future 객체가 완료될 때까지 대기하고, Future 객체가 완료되면 해당 결과를 result 변수에 저장합니다. 그리고 마지막으로 result 변수를 반환합니다.
예외 처리
Async 함수에서 예외가 발생할 수 있으므로 예외 처리가 필요합니다. Async 함수에서 예외가 발생하면 해당 예외는 Future 객체에 전달됩니다. 따라서 Async 함수를 호출한 측에서는 try/catch 블록을 사용해 예외를 처리할 수 있습니다.
try {
String result = await fetchData();
} catch (e) {
// 예외 처리
}
비동기 작업 병렬 실행
Flutter에서는 여러 비동기 작업을 병렬로 실행하고, 모든 작업이 완료될 때까지 대기하는 기능을 제공합니다. 이를 위해 Future.wait() 메소드를 사용합니다. Future.wait() 메소드는 Future 객체 리스트를 인자로 받고, 해당 리스트의 모든 Future 객체가 완료될 때까지 대기합니다.
Future<List<String>> fetchDataList() async {
List<Future<String>> futures = [];
futures.add(http.get(url1));
futures.add(http.get(url2));
futures.add(http.get(url3));
List<String> results = await Future.wait(futures);
return results;
}
위 예제에서는 http.get() 메소드를 사용해 세 개의 비동기 작업을 수행합니다. 각각의 비동기 작업는 http.get() 메소드가 반환하는 Future 객체를 리스트에 추가하고, Future.wait() 메소드를 호출하여 모든 Future 객체가 완료될 때까지 대기합니다. 그리고 마지막으로 결과를 리스트로 반환합니다.
결론
Flutter에서 Async/Await를 사용하면 비동기 작업을 효율적으로 처리할 수 있습니다. Async 함수를 사용하면 코드의 가독성과 유지보수성을 높일 수 있고, Await 키워드를 사용하면 Future 객체가 완료될 때까지 대기할 수 있습니다. 또한, Future.wait() 메소드를 사용하면 여러 비동기 작업을 병렬로 실행하고, 모든 작업이 완료될 때까지 대기할 수 있습니다. 이러한 Async/Await와 Future 객체를 활용하여 Flutter 애플리케이션을 개발할 때, 더욱 높은 성능과 가독성을 확보할 수 있습니다.
예제
다음은 Flutter에서 Async/Await를 사용한 예제 코드입니다. 이 예제 코드는 http 패키지를 사용하여 RESTful API에서 데이터를 가져오는 것을 기준으로 작성되었습니다.
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _data = 'Loading...';
@override
void initState() {
super.initState();
fetchData();
}
Future<void> fetchData() async {
try {
// 비동기 작업 수행
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
if (response.statusCode == 200) {
final json = jsonDecode(response.body);
setState(() {
_data = json['title'];
});
} else {
setState(() {
_data = 'Error: ${response.statusCode}';
});
}
} catch (e) {
setState(() {
_data = 'Error: $e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Async/Await Example'),
),
body: Center(
child: Text(_data),
),
);
}
}
이 예제 코드에서는 initState() 메소드에서 fetchData() 메소드를 호출하여 데이터를 가져옵니다. fetchData() 메소드에서는 http 패키지를 사용하여 RESTful API에서 데이터를 가져오고, 가져온 데이터를 setState() 메소드를 사용하여 화면에 출력합니다. fetchData() 메소드에서는 try/catch 블록을 사용하여 예외 처리를 수행합니다.
이 예제 코드에서는 Async/Await와 try/catch 블록을 사용하여 비동기 작업을 처리하고, setState() 메소드를 사용하여 화면을 업데이트합니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.
'IT' 카테고리의 다른 글
[github] WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! (0) | 2023.03.27 |
---|---|
[package] Brew 명령어 정의 및 정리 (0) | 2023.02.25 |
[Flutter] Flutter 란, 장점/단점 (0) | 2023.02.18 |
[Flutter] 안드로이드 앱 이름 설정, 변경 (0) | 2023.02.12 |
[https] 무료 SSL 인증서 (let's encrypt) cafe24 웹호스팅 (7) | 2023.02.09 |