티스토리 뷰
[1] 문서보기
FutureBuilder 는 Future와 상호작용한 마지막 스냅샷으로 자신을 빌드하는 위젯(?) 이라고 합니다.
정의가 잘 안와닿는데,
사용용도를 보면 확 이해가 됩니다
API콜을 해서 응답을 받기 전까지는 로딩 위젯를 보여주고
성공 응답을 받으면 데이터를 보여주는 위젯을 보여주고
실패 응답을 받으면 에러메세지를 보여주는 위젯을 보여주고
싶을때 쓰는 위젯입니다.
문서에 예제가 너무 잘되어있는데 이런식으로 쓸 수 있습니다. (문서코드 복붙)
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({Key key}) : super(key: key);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
Future<String> _calculation = Future<String>.delayed(
Duration(seconds: 2),
() => 'Data Loaded',
);
Widget build(BuildContext context) {
return DefaultTextStyle(
style: Theme.of(context).textTheme.headline2,
textAlign: TextAlign.center,
child: FutureBuilder<String>(
future: _calculation, // a previously-obtained Future<String> or null
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
List<Widget> children;
if (snapshot.hasData) {
children = <Widget>[
Icon(
Icons.check_circle_outline,
color: Colors.green,
size: 60,
),
Padding(
padding: const EdgeInsets.only(top: 16),
child: Text('Result: ${snapshot.data}'),
)
];
} else if (snapshot.hasError) {
children = <Widget>[
Icon(
Icons.error_outline,
color: Colors.red,
size: 60,
),
Padding(
padding: const EdgeInsets.only(top: 16),
child: Text('Error: ${snapshot.error}'),
)
];
} else {
children = <Widget>[
SizedBox(
child: CircularProgressIndicator(),
width: 60,
height: 60,
),
const Padding(
padding: EdgeInsets.only(top: 16),
child: Text('Awaiting result...'),
)
];
}
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: children,
),
);
},
),
);
}
}
참고로 FutureBuilder는 StatefulWidget의 자식클래스이고
생성자는 이렇게 생겼습니다.
[2] 실전예제
오늘의 질문을 api콜해서 받아와서 보여주는 HomeWidget을 FutureBuilder를 통해 만들어보겠습니다.
우선 Question 모델, Question 서비스가 이렇게 있습니다.
(json["detail"]의 값은 에러 메세지 입니다. )
HomeViewModel을 만들어주고
HomeWidget도 간단버전으로 구현해줍니다.
데이터가 있을때는 snapshot.data를 이용해서 화면을 그려주고
에러일때는 snapshot.error를 이용해서 화면을 그려주면 되겠네요.
그리고 로딩중일때는 CupertinoActivityIndicator를 보여줄게요-!!
HomeWidget을 이렇게 바꿔줄게요
그리고 API응답이 너무 빨라서 로딩이 안보여가지구
뷰모델이 2초있다가 서비스에게 요청하도록 해줄게요
class HomeViewModel {
var _service = QuestionService();
Future<Question> todayQuestion() {
return Future.delayed(Duration(seconds: 2), () {
return _service.requestTodayQuestion();
});
}
}
그러면 로딩 -> 성공 응답 화면 구성이 의도한대로 잘나옵니다
이번엔 의도적으로 header값을 안넣어줘서 에러를 일으켜볼게요
로딩 -> 에러 응답 화면 구성도 잘나오네요-!
'🤼♀️ > Flutter' 카테고리의 다른 글
[Flutter] Serializing JSON inside model class (0) | 2020.10.16 |
---|---|
[Flutter] Spacer로 adjustable한 empty spacing을 만들기 (0) | 2020.10.15 |
[Flutter] 쿠퍼티노 얼럿 띄우기 (CupertinoAlertDialog, showCupertinoDialog) (0) | 2020.09.25 |
[Flutter] iOS, 안드로이드에서 로컬 서버에 접속하기 (1) | 2020.09.25 |
[Flutter] 화면전환 (Navigator, CupertinoPageRoute) (0) | 2020.09.25 |
- Total
- Today
- Yesterday
- Flutter getter setter
- flutter 앱 출시
- Dart Factory
- 플러터 얼럿
- ribs
- Watch App for iOS App vs Watch App
- 장고 Custom Management Command
- flutter build mode
- cocoapod
- github actions
- Flutter 로딩
- 플러터 싱글톤
- drf custom error
- Sketch 누끼
- Django Firebase Cloud Messaging
- flutter dynamic link
- flutter deep link
- PencilKit
- Flutter Text Gradient
- 구글 Geocoding API
- METAL
- DRF APIException
- Django FCM
- Python Type Hint
- SerializerMethodField
- 장고 URL querystring
- Flutter Clipboard
- Flutter Spacer
- ipad multitasking
- Django Heroku Scheduler
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |