Future는 플러터로 개발하게 된다면 필수적으로 다룰 수 밖에 없는 객체다. 모든 비동기 반환 값이 얘로 감싸져 나오기 때문에..
onTap, onPressed와 같은 함수에 API가 호출되는 기능이 포함된다면 간단히 async, await만 붙여주면 되겠지만
1. FutureBuilder
웬만하면 이걸로 해결 가능함
Future<T> -> T의 변환 과정동안의 UI를 처리할 수 있다.
snapshot.hasData / snapshot.hasError
ConnectionStates.none / ConnectionStates.waiting / ConnectionStates.active / ConnectionStates.done
다양하게 처리 가능
FutureBuilder의 future를 재실행하여 화면을 리프레시하고 싶을 땐 간단히 setState만 해주면 됨
그런 의미에서 StatefulWidget 필수
근데 한 화면 안에서 TextField와 병행 사용하면 문제가 생길 수 있음
TextField를 탭함 -> 키보드가 올라가면서 위젯 재빌드(아마 재빌드를 여러번 하는 듯) -> 그와 함께 FutureBuilder의 future도 함께 재실행 -> 무한 API 호출 때문에 서버 터짐
이런 일을 몇 번 겪고 난 후에는 댓글 입력 필드 같은 부분이 필요한 화면이라면 FutureBuilder를 사용하지 않음
2. initState
원래는 initState에서 Future 처리를 바로 하지는 못하지만.. 편법으로 쓸 수 있다.
바로 메서드로 별도로 분리해두고 initState에서는 그 메서드만 불러와서 쓰는 것
사실 코드 가독성을 위해 메서드 분리가 필요하긴 하다는 합리화도 함께 곁들일 수 있다.
@override
void initState () {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_){
_asyncMethod();
});
}
_asyncMethod() async {
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
setState(() {
_currentUser = account;
});
});
_googleSignIn.signInSilently();
}
진짜 다트 코드 블럭 지원 좀...
아무튼 이런 느낌으로 씀
3. Provider
BLoC 패턴으로 처리하는 방법도 있는데 BLoC는 아직 못 다뤄봤으므로 패스
'Flutter' 카테고리의 다른 글
[Flutter] 상태 관리 하기 (2) | 2022.08.28 |
---|---|
[Flutter] Firebase Auth SMS 연동하기 - 2 (0) | 2022.04.26 |
[Flutter] Firebase Auth SMS 연동하기 - 1 (0) | 2022.04.11 |