본문 바로가기

Flutter/Widget

[Widget] Is there a way to load async data on initState method?

예를 들어 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

 

Is there a way to load async data on InitState method?

I'm a looking for a way to load async data on InitState method, I need some data before build method runs. I'm using a GoogleAuth code, and I need to execute build method 'till a Stream runs. My

stackoverflow.com

 

'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