개발을 시작하는 이야기

BuildContext 본문

개발 이야기/Flutter

BuildContext

Teiresias 2024. 1. 14. 18:42

Flutter 프롭젝트를 진행하다 보면 곳곳에서 BuildContext를 사용한다. 평상시에 사용할 때는 그저 위젯에 상태를 전달하는 방식으로 사용하고 있었다. Provider를 사용하거나, Widget을 구분해서 사용할 때는 별다른 무리가 없었다. 하지만 Localization을 사용할 때 약간의 문제가 발생 헸다. 

 

flutter_localizations 라이브러리를 사용해서 다국어를 처리하고 있었는데, 문제는 다국어 요청을 할 때, BuildContext를 보내주어야 한다는 것이다. 다만 이 context가 @override된 Widget 내부에서는 BuildContext를 받아서 사용할 수 있지만, 만일 값이 Widget 외부에 위치하고 있다면 BuildContext가 전달하는 방식을 알 수 없었다. 라이브러리를 변경해서 해결을 했지만 BuildContext를 정확하게 이해하고 넘어가야 다음번 문제에서도 해결할 수 있을 것 같았다.

 

Flutter는 Widget들이 모여 하나의 화면을 구현하는 방식을 많이 사용하게 되는데, override를 통해 Widget을 Build 할 때 인수로 BuildContext를 받고 있다. Flutter의 공식 홈페이지에서는  BuildContext를 다음과 같이 설명하고 있다. 

A handle to the location of a widget in the widget tree.
Widget Tree에서 현재 Widget의 위치를 알려주는 정보.

 

위젯을 빌드할때 현재의 위젯이 위젯 트리상에서 어디에 위치하고 있는지에 대한 정보를 반환해 준다는 것이다. 또한 각 위젯에는 StatelessWidget.build 또는 State.build 에서 반환된 위젯의 부모가 된다고 한다.

class MyPage extendes StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:
      body: SafeArea(),
      bottomSheet: 
    );
  }
}

 

MyPage라는 커스텀 위젯에도 자신만의 BuildContext를 갖고 있게 되는 것이다.

build 메서드를 통해서 Scaffold 위젯이 리터느 부모인 MyPagedml BuildContext를 그대로 물려받는다.

 

MyPage의 Widget build에 의해 리턴된 Scaffold widget에는 MyPage의 BuildContext를 그대로 물려받게 되고, Scaffold 위젯 내부에 build를 활용한 위젯을 리턴한다면, 그 위젯은 부모인 Scaffold 위젯의 context를 가진 위젯이 되는 것이다. 

Fluutter의 Widget의 구조로 트리와 닮았다고 해서 Widget Tree 라고 한다

 

 

Flutter 공식문서

 

BuildContext class - widgets library - Dart API

A handle to the location of a widget in the widget tree. This class presents a set of methods that can be used from StatelessWidget.build methods and from methods on State objects. BuildContext objects are passed to WidgetBuilder functions (such as Statele

api.flutter.dev

'개발 이야기 > Flutter' 카테고리의 다른 글

Flutter의 상태관리 01  (0) 2024.06.15
객체지향 프로그래밍 정리  (1) 2024.06.14
Android Google Cloud용 SHA-1 생성  (0) 2024.06.05
Stateless 그리고 Stateful  (0) 2023.11.06
iOS 개발자의 Flutter 적응기  (1) 2023.11.02