Future && FutureBuilder && print() 위치

Flutter

목록 보기
4/12

Future

  • data 에 퓨처 타입을 await 하면서 받아오는 것 이므로 실제 data에 값이 할당되기 까지 몇초의 시간이 소비됨.

    근데 채워지기 전에 data[] 이런식으로 사용하려고 하니까 에러가 발생할 수 있다.

NULL Check 필요한 상황

if 문을 통해서 data 변수가 비었는지 아닌지 판단이 가능하다.

반드시 else 구문도 함께 사용해야 한다.
Text() 대신
CircularProgressIndicator() 위젯
사용해도됨

이런 여러가지 예외처리가 필요하다.
1. 서버가 다운되었거나
2. 요청경로가 이상하거나

  • result.statusCode
  • 를 통해 성공케이스 판단 가능.

DIO

  • get 요청을 더 짧게 할 수 있는 http 대신 사용가능한 패키지
  • jsonDecode() 같은 함수 생략 가능

FutureBuilder 위젯

if 문 하기 귀찮을 경우 사용

  • future
FutureBuilder (
  future: http.get(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text('post에 데이터 있으면 보여줄 위젯')
    } 
    return Text('post에 데이터 없으면 보여줄 위젯')
  },
) 

1. future: Future를 담은 state.

  • http.get() 직접 적어도 되지만 state에 저장했다가 쓰는게 좋다.

2. builder: (){return ;}

  • 안의 코드는 입력한 state 데이터가 도착할 때 실행해줍니다.

3. snapshot

  • Future의 결과가 담긴 state 데이터를 의미.
  • FutureBuilder에서 snapshot 객체는 future로 전달된 비동기 작업의 상태와 결과를 담는다.
  • http.get() 요청이 완료되면, snapshot에 그 결과가 담김. - http.get() 요청이 완료되었을 때, snapshot의 hasData가 true로 설정
  • snapshot.data에는 요청의 결과가 포함.

FutureBuilder 위젯:

FutureBuilder는 비동기 작업(Future)의 상태에 따라 다른 위젯을 렌더링할 수 있게 해줍니다.
future 매개변수로 _initializeVideoPlayerFuture를 전달하고 있습니다. 이 Future는 비디오 플레이어가 초기화될 때 완료됩니다.
snapshot.connectionState:

snapshot.connectionState는 Future의 현재 상태를 나타냅니다.
ConnectionState.done이면 Future가 완료된 상태를 의미하며, 이 경우 비디오 플레이어가 초기화된 것이므로 비디오를 화면에 표시할 수 있습니다.
그 외의 상태에서는 로딩 스피너(CircularProgressIndicator)를 표시합니다.
비디오가 초기화된 경우:

snapshot.connectionState == ConnectionState.done이 참일 때, 비디오가 화면에 표시됩니다.
이때 AspectRatio 위젯을 사용하여 비디오의 화면 비율을 맞춘 뒤, VideoPlayer 위젯으로 비디오를 재생합니다.
비디오가 초기화되지 않은 경우:

ConnectionState.done이 아닐 때는 CircularProgressIndicator를 표시하여 로딩 중임을 나타냅니다.
전체적으로 이 코드는 어떻게 동작하나요?
앱이 실행되면 FutureBuilder는 _initializeVideoPlayerFuture가 완료될 때까지 기다립니다.
초기화가 완료되면 snapshot.connectionState가 ConnectionState.done으로 변경되고, 그 시점에 비디오가 화면에 표시됩니다.
초기화가 완료되기 전까지는 로딩 스피너가 표시됩니다.

데이터가 추가되는 경우가 잦으면 불편하다.

0개의 댓글