비동기 데이터를 활용하여 Flutter 앱에서 동적인 콘텐츠를 처리하는 것은 중요한 과제입니다. FutureBuilder
위젯은 비동기 데이터를 효율적으로 처리하고 사용자 인터페이스를 업데이트하는 데 유용합니다. 이 위젯은 미래에 완성될 데이터 (Future
)와 연결되며, 데이터의 상태에 따라 다른 위젯을 보여줄 수 있습니다.
future
: 데이터를 가져오는 Future
객체입니다. 이 속성은 데이터의 비동기 처리를 담당합니다.
builder
: BuildContext
와 AsyncSnapshot
을 파라미터로 받는 함수입니다. 이 함수는 데이터의 로드 상태에 따라 화면에 표시할 위저트를 반환합니다.
initialData
: 초기 데이터 값을 설정할 수 있으며, 데이터 로드 전에 표시됩니다.
서버에서 데이터 로드: 웹서버나 데이터베이스에서 정보를 가져올 때 사용됩니다.
동적인 사용자 인터페이스 제공: 데이터 로드 상태에 따라 다른 인터페이스를 동적으로 표시합니다.
비동기 작업의 상태 관리: 데이터 로딩, 데이터 완료, 에러 상태 등을 관리할 수 있습니다.
아래 예제는 FutureBuilder
를 사용하여 네트워크에서 데이터를 비동기적으로 가져오고, 그 결과를 기반으로 사용자 인터페이스를 구성하는 방법을 보여줍니다.
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2)); // 네트워크 지연 모방
return "데이터 로드 완료";
}
Scaffold(
body: FutureBuilder<String>(
future: fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('데이터 로드 중 오류 발생'));
} else {
return Center(child: Text(snapshot.data!)); // 데이터 표시
}
},
),
)
Future
와 FutureBuilder
의 독립적 타이밍:Future
는 데이터를 비동기적으로 로드하는 작업을 대표합니다 (예: 네트워크에서 데이터 가져오기).FutureBuilder
는 이 Future
의 완료 여부를 기다리면서, 완료 상태에 따라 UI를 다르게 보여줍니다.Future
가 완료되면 (Future
가 결과를 반환할 때), setState()
를 통해 위젯을 다시 빌드해야 합니다. 이는 Flutter가 Future
의 결과에 따라 UI를 업데이트하도록 스케줄링하는 과정입니다.FutureBuilder
의 builder
함수가 호출되는 시점은 Flutter의 내부 로직에 의해 결정됩니다. 즉, Future
의 상태 변화가 있을 때마다 정확히 일치하는 순간에 builder
가 호출되는 것이 아니라, Flutter가 필요하다고 판단하는 시점에 호출됩니다.오류 처리: FutureBuilder
를 사용할 때는 데이터 로드 실패 상황을 고려하여 오류 처리 로직을 추가하는 것이 중요합니다.
상태 관리: Future
의 상태에 따라 사용자에게 적절한 피드백을 제공하는 것이 사용자 경험을 개선합니다.
사이드 이펙트: 이미 완료된 Future
를 FutureBuilder
에 전달하는 경우, 초기 빌드에서는 대기 상태로 처리될 수 있으므로 이를 고려해 설계해야 합니다.
StreamBuilder: 비동기 스트림을 활용한 동적 데이터 처리를 위한 위젯입니다.
AsyncSnapshot: 비동기 작업의 최신 데이터 스냅샷을 제공합니다.
BuildContext: Flutter에서 위젯 트리 내의 위치를 나타내며, 다양한 프레임워크 기능을 이용할 때 중심적인 역할을 합니다.