본문 바로가기

Hello App/Flutter

Flutter _ Build Context

230524

 

 


오늘은 Build Context에 대해 알아보고

실습해보겠다.

 

 

우선 Stateful Widget에서

Text를 위젯으로 추출해주자.

 

코드 작업 표시에서

Extract Widget을 선택하면 된다.

 

Text 위젯을 MyLargeTitle

추출하였다.

 

우리는 지금까지 Text 위젯을 만들때

하나하나 수작업으로

글씨 크기, 색상, 굵기를 한곳에서 수정하였다.

 

이러한 불편함 없이

Flutter가 준비한

앱의 모든 스타일한 곳에서 지정하는 기능

Theme를 사용해보자.

 


1. Theme

 

Theme를 사용하기 위해서_AppState 클래스MaterialApp으로 가준다.

 

위와 같이 

_AppStatebuild()return값인

MaterialApptheme이 존재하고

 

themeTextTheme 위젯을 선택해

titleLarge로 만들어 주었다.

 

하지만 출력된 화면은 변함이 없다.

 

그 이유는 간단하다.

 

위 사진과 같이

Theme가 있는 곳은 _AppState 클래스이며,

StatefulWidget을 상속받았고

 

현재 화면에서 출력중인 Text 위젯은

MyLargeTitle 클래스이며 그것은 StatelessWidget

상속 받았기 때문이다.

 

즉, MyLargeTitleTheme의 값에 접근을 해야

우리가 보는 화면에 Theme가 적용된다.

 

 

이렇게 접근을 하기 위해서

MyLargeTitlebuild부분의

Buildcontext에 접근해야한다.

 

하지만 그 전에 Flutter위젯 트리에 대해 알아보자.

 

 


2. Widget Tree

 

위와 같이 Widget관계

Tree모양으로 만든것을 Widget Tree라고 한다.

 

이것의 장점은

Flutter가 애플리케이션을 어떻게 랜더링하는지를

보여주는것과 같다.

 

 

VScode에서는

Widget Inspector를 열어

WidgetTree를 확인할 수 있다.

 


3. Build Context

이러한 WidgetTree를 통해

내가 접근하고자 하는 부모요소

손 쉽게 알 수 있고

 

이러한 정보를 습득 후

BuildContext를 통해 접근을 하는것이다.

 

Context란 현재 My Large Title 위젯 기준으로

Text 이전의 모든 상위 요소들에 대한 정보를 의미하는데

 

그말은 곧 Context

모든 위젯트리의 정보를 가지고 있고

해당 위치에 접근을 할 수 있게 해준다.

 


_AppState 클래스의 

Theme에 저장된

TextStyle을 위와같이

 

MyLargeTitle 클래스

TextTextStyle로 가져올 수 있고

 

Dartnullsafety 원칙에 따라

null 방지를 위해 titleLarge!를 붙여

titleLarge에는 값이 있다고 알려준 후

 

위의 Text위젯 앞에 const를 떼어주면?

 

위와 같이

StatelessWidget 클래스의 요소인

Text가 

 

StatefulWidget의 

Theme의 요소를 받고있는것을

확인 할 수 있다.

 

💡

? 도 가능하다.

 


4. Widget Lifecycle

StatefulWidget은 살아있다.

이 말의 의미는 Lifecycle을 가지고 있다는 말이다.

 

조금 더 이해하기 쉽게 코드와 결과를 봐보자.

 

우선 StatelessWidget을 상속받았던

MyLargeTitle 클래스를 

SatefulWidget으로 바꿔주고

build()말고 또 어떤 method가 있는지 확인해보자.

 


 

4-1. initState()

 

initstate()

상태를 초기화 하기 위한 메서드 이다.

 

이러한 상태 초기화는

int count = 0;

과 같이 초기화 할 수 있기에

잘 사용하지는 않지만

 

종종 부모 요소에 의존하는 데이터

초기화해야하는 경우가 있다.

 

즉, context를 사용하여 초기화 하는 경우이다.

 

또한 어플리케이션을 업데이트할때도

필요하다.

 

중요한점은

반드시 super.initState();로 호출해야하고

build() 앞에 존재해야한다.

 

이렇게 initState()를 통해

buildUI들에 들어 있는 값을 초기화하여

새로 태어나게 하는것이다.

 


4-2. dispose()

 

 

dispose()

위젯스크린에서 제거될때

호출되는 메서드이다.

 

API 업데이트

이벤트 리스너로부터 구독을 취소하거나

form의 리스너로부터 벗어나고 싶을때

사용할 수 있다.

 

위젯위젯 트리에서 제거되기 전

무언가를 취소하거 싶은 경우

 

무언가를 취소하는 곳이라고 생각하면 편하다.

 

예시를 보자.

 

_AppState 클래스

bool 타입의 showTitle이란 변수를 만들고

 

showTitletrue이면

MyLargeTitle()가 

 

그렇지 않으면

Text('Nothing')이 실행되게 만들자.

 

현재는 showTitletrue이므로

빨간색의 My Large Title가 보인다.

 

그 반대인 경우에

dispose()가 작동되는지 확인하기 위해

toggleTitle()를 만들고

 

setState()

showTiltetrue일 경우

false로 바꾸게 만든다.

 

그리고 아래에 내려와

IconButton을 위와 같이 만들어 주었다.

 

 

위와 같이 아이콘이 생성 되었고

 

아이콘을 누르면?

showTitlefalse이므로

Nothing이 출력되고

 

dispose()에 

넣어놓은 print('dispose')

디버그 콘솔에 출력된다.

 

다시 아이콘을 누르면?

showTitle이 true이므로

 

build()로 만든

Text My Large Title이 출력되고

 

initstate() buid()

넣어놓은 print()

디버그 콘솔에 출력된다.

 


위와 같이 Stateful Class는 살아있다는것을 확인해 보았다.

 

build()

우리의 위젯으로 UI를 만들고

 

initstate()

build()전에 호출되고

변수를 초기화 하고

API를 업데이트하게 해준다.

 

dispose()

우리의 위젯이 위젯 트리에서 제거될 때

실행되는 메서드이다.

 

 

 

'Hello App > Flutter' 카테고리의 다른 글

Flutter _ Timer  (0) 2023.05.26
Flutter _ User Interface  (0) 2023.05.25
Flutter _ Stateful Widget  (0) 2023.05.24
Flutter _ Reusable Widgets  (0) 2023.05.21
Flutter _ Button Section  (0) 2023.05.20