Flutter 공식 문서에 Widget tree 에서 현재 Widget의 위치 를 알 수 있는 정보라고 함.
이를 가지고 계층 구조를 만들어 나감.
위젯트리에 있는 위젯 위치라고 할 수 있다.
각각의 위젯은 고유의 BuildContext를 가지고 있다.
class BuildContextExample extends StatelessWidget {
Widget build(BuildContext context) {
print("BuildContextExample Context : ${context.hashCode}");
return Builder(
builder: (context) {
print("Builder Context :${context.hashCode}");
return FloatingActionButton(onPressed: () {
Scaffold.of(context).showSnackBar(
new SnackBar(
backgroundColor: Colors.blue,
content: Builder(builder: (context) {
print("SnackBar Context : ${context.hashCode}");
return Text('SnackBar}');
}),
),
);
});
},
);
}
}
flutter: BuildContextExample Context : 143
flutter: Builder Context :421
flutter: SnackBar Context : 722
위의 코드처럼 각각의 위젯마다 BuildContext가 생성이 되는 것을 볼 수 있다.
이 때 builder를 사용해서 각각의 context를 하나의 위젯이 사용하는데, 하나의 context만 사용할 때의 문제가 있다.
Scaffold.of() called with a context that does not contain a Scaffold.
build가 호출되고 난 후 만들어지는 context는 Scaffold의 부모 위젯의 BuildContext이다. (build가 실행되는 시점에는 Scaffold가 생성이 되어 있지 않음)
즉, 아직 Scaffold의 BuildContext가 만들어지지 않았는데 Scaffold.of(context)로 찾으려고 하니 Context를 찾을 수 없다는 에러를 뿜어낸다.
그래서 이 부분은 builder 메소드를 사용하여 해결한다.
Builder 에서 부르는 context는 Scaffold가 만들어지고 나서의 BuildContext를 가지고 오기 때문에 코드상에서 불러도 오류가 나지 않는다.