플러터 주니어개발자분들이시라면 인터뷰 준비하실 때 BuildContext가 무엇이냐는 질문 한번쯤 받아보셨을 것 같습니다.
그동안은 면접을 위한 공부를 했던 것 같아요 면접이 끝나고 나면 새하얗게 지워버렸는데 개발을 잘하시는 분들은 그 자체로 정의가 잘 되어있다는 생각을 받습니다. 궁금해진 김에 정리해볼게요 👀
BuildContext 정의
간단하게 빌드 컨택스트는 위젯 트리 안에서 현재 위젯의 위치를 알 수 있는 정보 입니다.
@override
Widget build(BuildContext context) {
return Scaffold(
...
);
}
Stateless, Stateful에서 기본으로 생성되던 위의 코드는 보통 build 메서드가 return되는 Widget이 위젯 트리상에서 어디 위치하는 지 정보를 담아서 가지고 있는 context를 파라미터로 담아서 리턴해준다는 의미입니다.
그럼 플러터에서 BuildContext 를 사용하는 예제를 먼저 살펴보겠습니다.
// 새로운 화면으로 이동할 때
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
// 화면의 사이즈를 확인할 때
MediaQuery.of(context).size
//ListView를 그릴 때
ListView.builder(
itemBuilder: (context, index) {}
),
플러터에서는 모든 것이 위젯이라고 합니다.
우리가 알고있는 버튼, 텍스트, 이미지 등등 모든 위젯들은 앱 내에서 단독으로 존재할 수 없습니다. 위젯들 간의 순서가 존재하고 위젯들 간의 관계 속에서 그 위젯이 존재합니다. 위젯이 다른 위젯들과 관렸있는 지점을 알기 위한 방법이 없습니다.
조금 전에 플러터에서는 모든 것이 위젯이라고 말을 했습니다. Stateless와 Stateful 역시도 위젯을 상속하는 위젯입니다. 위젯의 메서드를 살펴보면 createElement()를 확인할 수 있습니다. 특정 위젯의 위치를 계속 추적하는 객체입니다.
예시로 새로운 위젯의 생성과정을 살펴보면
flutter 프레임워크는 Text("Hello, World!")를 호출하여 crateElement();의 요소 메서드를 생성하기 위하는데 이 요소 메서드는 런타임에 관한 정보(앱의 위치, 런타임에 필요한 정보) 를 관리합니다. 바로 이때 해당 Element는 다른 Element의 트리에서 효율적인 노드가 되며 이들이 나타내는 위젯에 대한 각각의 참조를 제공합니다. (Element: BuildContext의 타입 중 하나)
한줄요약
Build contenxt는 빌드 메서드를 필요한 위젯에게 위젯트리 내에서 런타임시 필요한 정보(위치)를 제공합니다.