Flutter에서 BuildContext
는 위젯 트리의 현재 위치를 나타내는 객체입니다. 이를 통해 Flutter는 위젯 트리에서 해당 위젯의 위치를 알고, 부모 또는 자식 위젯과의 상호작용을 관리할 수 있습니다.
BuildContext
를 사용하여 부모, 자식 또는 형제 위젯에 접근할 수 있습니다.Theme.of(context)
를 사용하여 현재 테마에 접근할 수 있습니다.Navigator.of(context)
를 사용하여 화면 전환을 관리할 수 있습니다.MediaQuery.of(context)
를 사용하여 화면 크기, 해상도 등의 정보에 접근할 수 있습니다.BuildContext
를 통해 부모, 자식 또는 형제 위젯에 접근하여 위젯 트리 내에서 상호작용할 수 있습니다.Theme.of(context)
를 사용하여 현재 테마의 스타일과 색상 등을 적용할 수 있습니다.Navigator.of(context)
를 사용하여 화면 전환을 관리하고, 새로운 화면을 푸시하거나 현재 화면을 팝할 수 있습니다.MediaQuery.of(context)
를 사용하여 디바이스의 화면 크기, 해상도, 방향 등의 정보를 얻을 수 있습니다.위젯 트리의 구성:
Flutter는 모든 것이 위젯으로 만들어져 있으며, 이러한 위젯들을 조합하여 위젯 트리를 만듭니다. 위젯 인스턴스는 트리상의 다양한 위치에 결합될 수 있습니다. 위젯 트리상의 위치 정보는 위젯 인스턴스의 트리상 위치에 따라 다릅니다.
Element와 BuildContext:
위젯 트리상의 위치 정보는 Element
객체가 가지고 있으며, Element
는 위젯 생성 시 내부적으로 함께 생성됩니다. Element
는 BuildContext
를 구현한 클래스입니다. 따라서 BuildContext
는 위젯 트리상의 위치 정보를 가진 객체로 이해할 수 있습니다.
BuildContext와 build() 메서드:
위젯 트리상의 위치 정보는 build()
가 호출될 때 BuildContext
로 전달됩니다. 예를 들어:
Widget build(BuildContext context) {
return Container();
}
InheritedWidget 접근:
context.dependOnInheritedWidgetOfExactType()
를 사용하여 현재 위치를 기준으로 가장 가까운 부모 InheritedWidget
을 조회할 수 있습니다.
Overlay 접근:
Overlay.of(context)
를 사용하여 조상 위젯에 있는 OverlayState
를 조회하여 Overlay
를 가져올 수 있습니다.
위치에 따른 BuildContext의 차이:
BuildContext
는 위치에 따라 다른 정보를 가지고 있습니다. 예를 들어, Scrollable.ensureVisible()
을 사용하여 특정 대상을 화면에 나타나도록 스크롤할 때, BuildContext
를 이용하여 그 대상을 선정합니다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Column(
children: [
ThemedWidget(),
ElevatedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('Go to Second Page'),
),
ResponsiveWidget(),
ChildWidget(),
],
),
);
}
}
class ThemedWidget extends StatelessWidget {
Widget build(BuildContext context) {
return Container(
color: Theme.of(context).primaryColor,
child: Center(
child: Text('This is themed with the primary color'),
),
);
}
}
class SecondPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Second Page')),
body: Center(
child: Text('This is the second page'),
),
);
}
}
class ResponsiveWidget extends StatelessWidget {
Widget build(BuildContext context) {
var screenSize = MediaQuery.of(context).size;
return Center(
child: Text('Screen size: ${screenSize.width} x ${screenSize.height}'),
);
}
}
class ChildWidget extends StatelessWidget {
Widget build(BuildContext context) {
final scaffold = context.findAncestorWidgetOfExactType<Scaffold>();
return Center(
child: Text('Found ancestor: ${scaffold != null}'),
);
}
}
context
를 사용하여 부모 위젯이나 상위 트리의 다른 위젯에 접근합니다.MediaQuery
를 사용하여 다양한 화면 크기에 대응하는 반응형 디자인을 만듭니다.Theme.of(context)
를 사용하여 현재 테마의 스타일을 적용합니다.Navigator.of(context)
를 사용하여 화면 전환을 관리합니다.BuildContext
클래스의 공식 문서입니다.Navigator
클래스의 공식 문서입니다.MediaQuery
클래스의 공식 문서입니다.Theme
클래스의 공식 문서입니다.