Flutter의 Future
Future는 Flutter와 Dart에서 비동기 작업을 처리하기 위한 객체입니다. Future
는 나중에 완료될 작업을 나타내며, 데이터나 값이 준비되지 않은 상태에서 비동기 작업을 수행할 수 있게 해줍니다.
Future의 주요 개념
- 비동기 작업 처리:
Future
는 시간이 오래 걸리는 작업(예: 네트워크 요청, 파일 읽기/쓰기)이 완료될 때까지 기다리지 않고, 작업이 완료되면 그 결과를 처리할 수 있게 도와줍니다.
- 두 가지 결과:
Future
는 두 가지 상태를 가질 수 있습니다. 성공적으로 완료되어 값을 반환하거나, 오류가 발생하여 에러를 반환할 수 있습니다.
Future 사용 예시
간단한 Future
사용 예시는 아래와 같습니다. 2초 후에 데이터를 반환하는 비동기 함수를 정의한 것입니다:
Future fetchData() async {
await Future.delayed(Duration(seconds: 2));
return '데이터가 로드되었습니다';
}
void main() async {
print('데이터 로딩 중...');
String data = await fetchData(); // 비동기 함수 호출 및 결과 대기
print(data); // '데이터가 로드되었습니다' 출력
}
Future의 상태
Future
는 세 가지 상태를 가질 수 있습니다:
- Uncompleted: 비동기 작업이 아직 완료되지 않은 상태입니다.
- Completed with a value: 비동기 작업이 성공적으로 완료되고 값을 반환한 상태입니다.
- Completed with an error: 비동기 작업 중 에러가 발생하여 에러가 반환된 상태입니다.
FutureBuilder와 Future의 사용
Flutter에서는 FutureBuilder
를 사용하여 Future
의 상태를 추적하고, 그에 따라 UI를 업데이트할 수 있습니다.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('FutureBuilder 예제'),
),
body: Center(
child: FutureBuilder(
future: fetchData(), // 비동기 작업 호출
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator(); // 대기 중일 때 로딩 표시
} else if (snapshot.hasError) {
return Text('에러 발생: ${snapshot.error}');
} else if (snapshot.hasData) {
return Text('데이터: ${snapshot.data}'); // 데이터를 성공적으로 받았을 때
} else {
return Text('데이터 없음');
}
},
),
),
),
);
}
Future fetchData() async {
await Future.delayed(Duration(seconds: 2));
return '비동기 데이터';
}
}
Future의 주요 메서드
- then(): 비동기 작업이 성공적으로 완료된 후, 그 결과를 처리하는 메서드입니다.
- catchError(): 비동기 작업 중 에러가 발생했을 때 에러를 처리하는 메서드입니다.
- whenComplete(): 작업이 성공 또는 실패에 상관없이 완료되었을 때 호출되는 메서드입니다.
예제: then()을 사용하는 방법
then()
메서드를 사용하여 비동기 작업의 결과를 처리하는 예시는 다음과 같습니다:
Future fetchData() async {
await Future.delayed(Duration(seconds: 2));
return '데이터가 로드되었습니다';
}
void main() {
fetchData().then((data) {
print(data); // '데이터가 로드되었습니다' 출력
}).catchError((error) {
print('에러 발생: $error');
});
}
결론
Future
는 Flutter에서 비동기 작업을 처리하는 매우 중요한 도구입니다. 네트워크 요청, 파일 입출력 등 시간이 걸리는 작업을 수행할 때 Future
를 사용하여 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 처리할 수 있습니다.