본문 바로가기

# 02/Flutter

[Flutter] BuildContext 객체와 위젯 키

반응형

BuildContext

 

위젯 하나 당 BuildContext 가 존재한다.

위젯에 필요한 다양한 정보가 들어 있고 그중 위젯 트리에서 위치와 관련된 정보가 대표적이다.

이 정보를 이용하여 위젯 트리에서 상위 위젯 객체를 얻을 수 있다.

 

MyApp? app = context.findAncestorWidgetOfExactType<MyApp>();

 

엘리먼트 트리가 바로 BuildContext 객체의 트리이다.

 

[Flutter] 위젯 트리

Flutter 에는 화면을 구성하는 3개 트리 구조가 존재 한다. 개발자가 코드를 작성하는 위젯 트리(Widget Tree)와 Flutter 프레임워크가 화면을 만들 때 만드는 엘리먼트 트리(Element Tree), 렌더 트리(Render T

zoiworld.tistory.com

 

abstract class Element extends DiagnosticableTree implements BuildContext { ... }

 

Element는 BuildContext를 구현해서 만들었으므로 엘리먼트 트리에 유지되는 객체가 BuildContext 객체라고 보면 된다.

 

 

 

 

위젯을 식별하는 Key

 

모든 위젯은 키값을 가질 수 있다.

모든 위젯의 상위 클래스인 Widget 클래스의 생성자를 보면 매개변수에 Key 라는 변수 하나만 선언되어 있다.

 

 

Key를 사용하는 경우!!

 

상위 위젯에서 같은 StatefulWidget을 두 개 이상 사용하는 경우 상위 위젯 에서 하위 위젯의 순서를 바꿔서 다시 빌드하면 위젯 객체는 분명히 바뀌지만 State 객체를 각 위젯 객체에 올바르게 연결해야 하는데 타입이 같아 처음에 생성된 순서대로 연결하다 보니 원하는 결과가 나오지 않는다.

 

이 때 각 하위 StatefulWidget 에 key: Uniquekey() 를 넣어 주면 제대로 구현되는 것을 확인 할 수 있다.

 

 

Key 하위 에는 GlobalKey, LocalKey가 있고 차이점은 "키값이 어느 영역에서 유일한 값인가?" 이다.

 

GlobalKey 는 앱 전체, LocalKey 는 이 키값이 지정된 위젯의 부모부터 자식 위젯에서 유일한 값이다.

 

GlobalKey 는 currentState, currentWidget 속성으로 현재 이용하는 키값으로 식별되는 위젯과 State 객체를 얻을 수 있다.

단, GlobalKey를 사용하면 위젯의 트리 구조가 변경되거나 모든 위젯을 다시 빌드할 수 있으므로 단순히 위젯을 식별하는 용도로만 사용할 키값은 GlobalKey로 만들지 않는 것이 좋다.

 

LocalKey는 이 키로 식별할 위젯의 부모부터 자식에서 유일한 값을 지정할 때 사용한다.

LocalKey 하위 클래스로 ValueKey, ObjectKey, UniqueKey 가 있고 주로 이 클래스를 이용해 위젯의 키값을 지정한다.

 

  • ValueKey : 문자열, 숫자 키값
  • ObjectKey : 객체 키값
  • UniqueKey : 유일한 난수 키값

 

 

 

 

 

 

 

 

 


http://www.yes24.com/Product/Goods/117206541

 

Do it! 깡샘의 플러터 & 다트 프로그래밍 - YES24

‘깡샘’으로 유명한 앱 개발 전문가의 명성 그대로!다트 핵심 문법을 익히고 플러터로 모바일 앱을 만들어 보자!매년 수백 명의 개발자를 양성하는 IT 전문 강사이자 안드로이드 베스트셀러의

www.yes24.com

 

반응형

'# 02 > Flutter' 카테고리의 다른 글

[Flutter] What’s new in Dart and Flutter (Flutter 3.10 / Dart 3.0)  (0) 2023.06.19
[Flutter] 면접 질문!  (0) 2023.03.19
[Flutter] State의 생명 주기  (0) 2023.03.12
[Flutter] StatefulWidget 의 State  (0) 2023.03.12
[Flutter] 위젯 트리  (0) 2023.03.12