목차
- 사용된 기능 설명
- 사용 예시
- Dio 설정 시 에러 처리 방법
✅ 사용된 기능 설명
- async : 비동기 함수를 표시하는 키워드로, 함수 앞에 async를 붙이면 그 함수는 무조건 Future를 반환
- await : 비동기 작업(Future)이 끝날 때까지 함수 안의 다음 줄 실행을 잠시 멈추게 하는 키워드
** 해당 함수 안에서만 작성된 코드의 작업 순서를 보장 - dio.get() : Dio 라이브러리로 GET 요청
- RefreshIndicator : 사용자가 화면을 아래로 당기면 새로고침 동작을 수행하는 위젯 (화면 새로고침에 사용)
** 내부 요소로 사용되는 child에는 스크롤 가능한 위젯만 가능 (ListView, SingleChildScrollView 등)
- onRefresh : 새로고침 시 호출될 비동기 함수 호출
- SingleChildScrollView : 하나의 자식 위젯을 스크롤 가능하게 만들어주는 컨테이너
** 여러 자식 위젯을 스크롤 시키려면, Column, Row 등으로 감싸면 가능- physics : 스크롤 동작의 물리적 성질을 제어하는 속성으로 사용자가 느끼는 '감속, 튕김, 고정' 효과 설정 가능
- BouncingScrollPhysics() : iOS 스타일 바운스 효과
- ClampingScrollPhysics() : Android 스타일 끝에서 튕기지 않고 멈춤
- AlwaysScrollableScrollPhysics() : 내용이 작아도 항상 스크롤 가능
- NeverScrollableScrollPhysics() : 스크롤 불가
- physics : 스크롤 동작의 물리적 성질을 제어하는 속성으로 사용자가 느끼는 '감속, 튕김, 고정' 효과 설정 가능
- FutureBuilder : 비동기(Future) 데이터를 기다렸다가 UI에 반영할 때 사용하는 위젯
** API 호출, 로컬 JSON 읽기, 데이터베이스 조회 같은 작업을 처리할 때 사용- future : 기다릴 Future 객체 (ex: API 요청 결과)
- builder : Future 상태에 따라 UI를 만들어주는 함수
- initialData : Future 완료 전 초기 데이터 (선택)
- AsyncSnapshot : Future나 Stream의 현재 상태와 데이터를 담는 객체
- snapshot.data : Future/Stream이 완료되었을 때 반환된 실제 데이터
- snapshot.hasData : 데이터가 존재하면 true, 없으면 false
- snapshot.hasError : 에러가 발생하면 true
- snapshot.error : 발생한 에러 객체
- snapshot.connectionState : Future/Stream 상태 (none, waiting, active, done)
- CircularProgressIndicator : 원형 회전 로딩 스피너를 표시하는 위젯
- value : 0.0 ~ 1.0 사이 값으로 진행률을 표시할 때 사용. null이면 무한 회전
- strokeWidth : 원형 선의 굵기(두께) 지정
- color : 회전 원의 색상 지정
- backgroundColor : 원의 배경색 지정
✅ 사용 예시
1️⃣ pubspec.yaml 설정
- dio 설정

2️⃣ 신규 파일 작성
- product.dart 작성

3️⃣ 메소드 및 변수 선언
- productList 변수 선언 및 dio 초기화
- 앱 실행 시 초기화 메소드 작성
- 작성된 https 를 통해 받아온 데이터를 처리하는 메소드 작성

4️⃣ Scaffold 작성
- body 작성

5️⃣ 테스트
✅ Dio 설정 시 에러 처리 방법
1️⃣ pubspec.yaml 에서 dio 설정 후, import를 진행하면 '패키지를 찾을 수 없다'는 에러 발생

2️⃣ 터미널에 패키지 적용을 위해 명령어 입력
- flutter pub get
- flutter upgrade

✔️사용된 코드
class _MyHomePageState extends State<MyHomePage>{
late Future<List<Product>> productList;
Dio dio = Dio();
@override
void initState() {
super.initState();
productList = getProductData();
}
Future<List<Product>> getProductData() async{
late List<Product> products;
try{
var response = await dio.get("https://dummyjson.com/products");
products = response.data['products']
.map<Product>((json) => Product.fromJson(json))
.toList();
}catch(e){
print("error 입니다.");
}
return products;
}
Future<void> refreshData() async{
productList = getProductData();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Test App"),
),
body: RefreshIndicator.adaptive(
onRefresh: () => refreshData(),
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: FutureBuilder<List<Product>>(
future: productList,
builder: (BuildContext con, AsyncSnapshot snapshot){
if(!snapshot.hasData){
return const Center(
child: CircularProgressIndicator(strokeWidth: 2,),
);
}else{
return ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: snapshot.data.length,
itemBuilder: (BuildContext cont, int index) {
var data = snapshot.data[index];
return Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
border: Border.all(width: 1, color: Colors.black26),
),
child: Text("제목 : ${data.title} \n설명 : ${data.description}"),
);
},
);
}
},
),
),
),
);
}
}
'IT 언어 > Flutter' 카테고리의 다른 글
| [Flutter] GetX (Simple State, GetBuilder, Get.find, update()) [맥북💻] (0) | 2025.09.27 |
|---|---|
| [Flutter] BLoC 패턴 (factory, dynamic, required, rxdart, http) [맥북💻] (0) | 2025.09.25 |
| [Flutter] 앱 하단 네비게이션 (bottomNavigationBar, TabBar, setState) [맥북 💻] (0) | 2025.09.21 |
| [Flutter] 데이터를 기기에 저장하기 (SharedPreferences) [맥북💻] (0) | 2025.09.20 |
| [Flutter] JSON 데이터 불러오기 (Future, async) [맥북💻] (0) | 2025.09.16 |