본문 바로가기

Mobile/Flutter

[Flutter] BuildContext 이해하기

728x90
반응형

Flutter 공식 문서를 살펴보면 BuildContext에 대한 두 가지 정의를 찾을 수 있다.

1

A handle to the location of a widget in the widget tree.
위젯 트리에서 위젯의 위치를 다루는 것
Widget build(BuildContext context){
    // ...
    return Scaffold(...)
}

먼저 알아야 할 것은 Flutter 안의 모든 Widget은 내부에 build 메서드를 가지고 있다는 것이다. build 메서드는 widget tree 상에서 어디에 위치하는지에 대한 정보를 가지고 있는 context를 넣어 Scaffold Widget 리턴한다.

2

Each widget has its own BuildContext, which becomes the parent of the widget returned by the StatelessWidget.build or State.build function.
모든 위젯은 자신만의 BuildContext를 가지고 있고, 그것은 StatelessWidget.build 또는 State.build에 의해 반환되는 위젯의 부모가 된다.
class MainPage extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return Scaffold(
      appBar: ...(),
      body : Center(
      	child: RaisedButton(
          onPress : () {
          
          },
          child: Text('Press'),
        )
      )
    )
  }
}

onPress 안에서 snackbar라던가 dialog을 다뤄야 한다면 scaffold의 context가 필요하다. 일반적으로 MainPage의 build에서 넘어온 context에 접근하면 된다고 생각하기 쉽다. 그러나 그렇게 하면 "Scaffold.of() called with a context that does not contain a scaffold."와 같은 에러 메세지를 보게 될 것이다.

 

왜 이런 상황이 벌어지는 것일까? buildcontext의 두 번째 개념을 생각해보면 해결된다. build 메서드의 인자값에 있는 context는 return되는 Scaffold 부모의 context이다. 부모의 context에는 부모 위젯까지의 정보밖에 없기 때문에 build 메서드를 통해 return되는 위젯의 정보는 없다. 그렇기 때문에 이 build 메서드의 context에서 scaffold에 대한 context 정보를 찾지 못하는 것이다. 

이것을 해결하는 방법으로는 builder 위젯을 사용하거나 별도로 분리해서 자식 위젯을 만드는 방법이 있다. 이 방법들에 대해서는 다음 포스팅에서 자세히 살펴보겠다.

728x90
반응형