InheritedWidget
은 Flutter에서 상위 위젯에서 하위 위젯으로 데이터를 전달할 때 사용하는 위젯입니다. InheritedWidget
을 사용하면 트리의 중간 위젯들을 거치지 않고도 상태를 하위 위젯으로 전달할 수 있어 상태 관리에 유용합니다.
InheritedWidget
에서 데이터를 가져올 때 사용합니다. BuildContext
를 통해 상위 InheritedWidget
에 접근합니다.InheritedWidget
이 존재하지 않으면 런타임 에러가 발생할 수 있습니다.자식 위젯의 독립성: 자식 위젯이 공유 상태나 메서드를 갖지 않아도 됩니다. 따라서 const
키워드를 사용할 수 있어 빌드 성능이 최적화됩니다.
MediaQuery
, Theme.of
등 Flutter의 기본적인 위젯들도 InheritedWidget
을 사용하여 구현되었습니다. 이를 통해 디바이스의 크기나 테마 설정 등에 쉽게 접근할 수 있습니다.updateShouldNotify
: InheritedWidget
이 재빌드되어야 하는지를 결정하는 메서드입니다. 이전 데이터와 새로운 데이터를 비교하여 필요할 때만 하위 위젯들을 다시 빌드합니다.아래 예제는 간단한 카운터 앱을 통해 InheritedWidget
의 사용 방법을 보여줍니다.
class Counter extends InheritedWidget {
final int count;
final Function() increment;
Counter({
Key? key,
required this.count,
required this.increment,
required Widget child,
}) : super(key: key, child: child);
static Counter? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<Counter>();
}
bool updateShouldNotify(Counter oldWidget) {
return oldWidget.count != count;
}
}
class CounterApp extends StatefulWidget {
_CounterAppState createState() => _CounterAppState();
}
class _CounterAppState extends State<CounterApp> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
Widget build(BuildContext context) {
return Counter(
count: _counter,
increment: _incrementCounter,
child: Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(child: CounterDisplay()),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
),
);
}
}
class CounterDisplay extends StatelessWidget {
Widget build(BuildContext context) {
final counter = Counter.of(context);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('You have pushed the button this many times:'),
Text('${counter?.count}', style: Theme.of(context).textTheme.headline4),
],
);
}
}
InheritedWidget
은 Prop Drilling 문제를 효과적으로 해결할 수 있는 도구입니다. 부모 위젯에서 자식 위젯으로 상태를 전달할 때 중간에 위치한 위젯들이 불필요한 속성을 전달받지 않도록 합니다.
updateShouldNotify
메서드를 적절히 구현하여 불필요한 위젯 빌드를 최소화합니다.Provider
, Riverpod
, BLoC
등 더 강력한 상태 관리 도구를 사용하는 것이 좋습니다.