예를 들어 API를 처음 시작할 때 불러온다든가 (물론.. 함수로 빼주면 되긴하지만..) 할 때에 initState 안에서 async, await를 사용하고 싶을 때가 있을 것이다. 하지만 initState에는 async, await를 사용할 수 없기 때문에 다른 방법을 찾아야 하는데 그것이 가능하도록 하는 방법을 이번 주제로 다루려고 한다.
첫 번째 방법! : WidgetsBinding.instance.addPostFrameCallback() + Future 함수
코드로 살펴보자! (위에서도 언급했지만 함수를 따로 만들어서 할 수 있는 방법이 있다!)
아래에서는 setState를 사용하기 때문에
WidgetsBinding.instance.addPostFrameCallback 를 붙여주었다.
왜냐하면 build가 끝나지 않은 시점에 데이터의 변경이 일어나기 때문에 값을 변경하면 Error가 뜰 수 있기 때문이다.
하지만 Callback 함수를 이용하게 되면 build가 끝난 후 초기값을 설정하기 때문에 Error가 뜨지 않는다.
@override
void initState () {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_){
_asyncMethod();
});
}
_asyncMethod() async {
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account){
setState(() {
_currentUser = account;
});
});
_googleSignIn.signInSilently();
}
두 번째 방법: then 사용
두 번째 방법은 함수에 then or whenCompleted를 사용하는 방법이다.
// ...
@override
initState() {
super.initState();
myAsyncFunction
// as suggested in the comment
// .whenComplete() {
// or
.then((result) {
print("result: $result");
});
}
//...
세 번째 방법: Future 함수를 사용해서 Future Type을 리턴하고, FutureBuilder를 통해서 값을 받아오는 방식
[참고링크]
🔗 https://stackoverflow.com/questions/51901002/is-there-a-way-to-load-async-data-on-initstate-method
'Flutter > Widget' 카테고리의 다른 글
[Widget] Material Widget (0) | 2021.12.09 |
---|---|
[Widget] MaterialStateProperty of Button (0) | 2021.12.09 |
[Widget] CheckBox (0) | 2021.11.30 |
[Widget] TextField, TextFormField (validate) (0) | 2021.11.30 |
[Widget] WillPopScope (0) | 2021.11.23 |