2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Flutter에서 FutureBuilder를 사용하는 방법은 무엇인가요?

_____
Q1: Flutter에서 FutureBuilder란 무엇인가요?
A1: FutureBuilder는 비동기 작업(Future)의 상태를 쉽게 UI에 반영할 수 있도록 도와주는 위젯입니다. 비동기 작업이 진행 중일 때, 완료됐을 때, 또는 에러가 발생했을 때 각각 다른 UI를 보여줄 수 있습니다.

---

Q2: FutureBuilder를 언제 사용해야 하나요?
A2: 네트워크 데이터 요청, 파일 읽기, 데이터베이스 조회 등 비동기 작업 결과를 UI에 반영해야 할 때 사용합니다. Future가 완료될 때까지 로딩 상태를 보여주고, 완료 후 데이터를 렌더링하거나 에러 처리 UI를 보여줄 수 있습니다.

---

Q3: FutureBuilder를 사용하는 기본적인 방법은?
A3: FutureBuilder 위젯을 만들고, `future` 속성에 Future 객체를 전달합니다. `builder` 속성 콜백에서 `AsyncSnapshot` 상태에 따라 조건별 위젯을 반환하면 됩니다.

예시:
```dart
FutureBuilder(
future: fetchData(), // 비동기 함수
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator(); // 로딩 중 UI
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'); // 오류 표시
} else if (snapshot.hasData) {
return Text('Data: ${snapshot.data}'); // 데이터 표시
} else {
return Text('No data'); // 기본 상태
}
},
)
```

---

Q4: AsyncSnapshot에는 어떤 상태가 있나요?
A4: 주요 상태는 다음과 같습니다.
- `connectionState`
- `none`: 아직 Future가 할당되지 않음
- `waiting`: Future가 실행 중 (로딩 중)
- `active`: 스트림에서 활성 상태 (FutureBuilder에서는 거의 사용 안 함)
- `done`: Future가 완료됨
- `hasData`: Future가 성공적으로 데이터를 반환했는지 여부
- `data`: Future가 반환한 실제 데이터
- `hasError`: Future 수행 중 에러 발생 여부
- `error`: 발생한 에러 객체

---

Q5: FutureBuilder에서 Future를 직접 생성해도 되나요?
A5: 가능은 하지만 권장하지 않습니다. 빌드 메서드가 여러 번 호출될 때마다 새로운 Future가 생성되기 때문에 의도하지 않은 재요청이 발생할 수 있습니다. 이럴 때는 Future를 StatefulWidget의 상태 변수에서 생성하고 캐싱하는 것이 좋습니다.

예시:
```dart
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State {
late Future _futureData;

@override
void initState() {
super.initState();
_futureData = fetchData(); // initState에서 한번만 호출
}

@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _futureData,
builder: (context, snapshot) {
// 상태 처리 로직
},
);
}
}
```

---

Q6: FutureBuilder 안에서 발생한 에러를 어떻게 처리하나요?
A6: `builder`의 `snapshot.hasError`가 true일 때 `snapshot.error`에 접근해 에러 메시지를 UI에 표시하거나 적절히 처리할 수 있습니다.

---

Q7: 여러 Future를 동시 처리하려면 FutureBuilder를 어떻게 사용하나요?
A7: FutureBuilder 하나는 하나의 Future만 취급합니다. 여러 Future를 동시에 처리하려면 `Future.wait`를 사용해 합쳐서 처리하거나 여러 FutureBuilder를 중첩해서 사용할 수 있습니다.

예시 (Future.wait):
```dart
FutureBuilder>(
future: Future.wait([fetchData1(), fetchData2()]),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error');
}
final data1 = snapshot.data![0];
final data2 = snapshot.data![1];
return ...;
} else {
return CircularProgressIndicator();
}
},
);
```

---

Q8: FutureBuilder는 어디에 위치하는 게 좋은가요?
A8: 비동기 데이터와 UI를 밀접하게 연결시켜야 하므로 필요한 컴포넌트 내에 위치하는 것이 좋습니다. 너무 상위에 두어 재빌드가 잦으면 비효율적일 수 있으니 주의해야 합니다.

---

Q9: FutureBuilder 사용 시 주의할 점이 있나요?
A9:
- Future를 build 메서드 안에서 직접 생성하지 말 것 (재빌드 시 중복 실행 위험).
- 비동기 작업 중 위젯 트리가 재빌드될 수 있으므로 상태 및 Future 관리를 신중히 할 것.
- UI가 너무 복잡해지면 별도의 상태 관리 솔루션(Provider, Bloc 등)을 고려할 것.

---

요약하면, FutureBuilder는 Flutter에서 비동기 결과를 쉽게 UI에 반영하도록 도와주는 위젯이며, 올바르게 Future를 관리하고, `builder` 내에서 상태 별로 UI를 분기 처리하는 것이 중요합니다.
`FutureBuilder`는 Flutter에서 비동기 작업의 결과를 처리하고 UI를 업데이트하는 데 유용한 위젯입니다.

주로 API 호출, 데이터베이스 쿼리, 파일 읽기 등과 같은 비동기 작업의 결과를 기다리는 동안 UI를 구성하는 데 사용됩니다.

`FutureBuilder`는 `Future` 객체를 사용하여 비동기 작업의 상태를 관리하고, 그 상태에 따라 적절한 UI를 표시합니다.

기본 사용법 `FutureBuilder`는 다음과 같은 주요 속성을 가집니다: - `future`: 비동기 작업을 수행하는 `Future` 객체입니다.

- `builder`: `AsyncSnapshot`을 인자로 받아 UI를 구성하는 함수입니다.

이 함수는 `snapshot`의 상태에 따라 다른 위젯을 반환합니다.

예제 코드 아래는 `FutureBuilder`를 사용하여 API에서 데이터를 가져오는 간단한 예제입니다.

```dart import 'package:flutter/material.dart'; import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('FutureBuilder Example')), body: DataFetcher(), ), ); } } class DataFetcher extends StatelessWidget { Future> fetchData() async { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts')); if (response.statusCode == 200) { List data = json.decode(response.body); return data.map((post) => post['title'] as String).toList(); } else { throw Exception('Failed to load data'); } } @override Widget build(BuildContext context) { return FutureBuilder>( future: fetchData(), builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Center(child: CircularProgressIndicator()); } else if (snapshot.hasError) { return Center(child: Text('Error: ${snapshot.error}')); } else if (snapshot.hasData) { List titles = snapshot.data!; return ListView.builder( itemCount: titles.length, itemBuilder: (context, index) { return ListTile(title: Text(titles[index])); }, ); } else { return Center(child: Text('No data found')); } }, ); } } ``` 코드 설명 1. fetchData() : 이 함수는 HTTP GET 요청을 통해 데이터를 가져옵니다.

성공적으로 데이터를 가져오면 JSON을 파싱하여 제목 목록을 반환합니다.

실패할 경우 예외를 발생시킵니다.



2. FutureBuilder : `FutureBuilder`는 `fetchData()`를 호출하여 `Future`를 생성합니다.

`builder` 속성에서 `AsyncSnapshot`을 사용하여 비동기 작업의 상태를 확인합니다.



3. snapshot.connectionState : 이 속성을 통해 현재 비동기 작업의 상태를 확인할 수 있습니다.

`ConnectionState.waiting`일 경우 로딩 인디케이터를 표시합니다.



4. snapshot.hasError : 에러가 발생한 경우 에러 메시지를 표시합니다.



5. snapshot.hasData : 데이터가 성공적으로 로드된 경우, 리스트 뷰를 사용하여 데이터를 표시합니다.

추가 팁 - 상태 관리 : `FutureBuilder`는 비동기 작업의 상태를 관리하는 데 유용하지만, 복잡한 상태 관리가 필요한 경우 `Provider`, `Bloc`, `Riverpod`와 같은 상태 관리 패턴을 고려하는 것이 좋습니다.

- 재사용성 : `FutureBuilder`를 여러 곳에서 사용해야 하는 경우, 별도의 위젯으로 분리하여 재사용성을 높일 수 있습니다.

- 에러 처리 : 에러 처리를 더 세밀하게 하고 싶다면, 다양한 에러 유형에 따라 다른 UI를 제공할 수 있습니다.

- Refresh : 데이터를 새로 고침해야 하는 경우, `FutureBuilder`의 `future` 속성을 업데이트하여 새로운 `Future`를 제공하면 됩니다.

이와 같이 `FutureBuilder`는 Flutter에서 비동기 작업을 처리하고 UI를 업데이트하는 데 매우 유용한 도구입니다.

다양한 상황에서 활용할 수 있으며, 비동기 프로그래밍의 복잡성을 줄여줍니다.

작성자: 최유진 [비회원] | 작성일자: 1년 전 2024-09-19 01:51:25
조회수: 126 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.