본문 바로가기
Flutter

Future 다루기

by be_beee 2022. 5. 29.

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