Как правильно использовать Inherited Widget?

InheritedWidget
в Flutter используется для передачи данных вниз по дереву виджетов без необходимости передавать их через каждый виджет вручную. Это полезно, когда нужно предоставить доступ к данным или состоянию нескольким дочерним виджетам.
Вот основные шаги для использования InheritedWidget
:
1. Создание класса, наследующего InheritedWidget
class MyInheritedWidget extends InheritedWidget {
final int counter;
MyInheritedWidget({required this.counter, required Widget child}) : super(child: child);
// Метод для получения доступа к данным
static MyInheritedWidget? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
// Этот метод указывает, следует ли обновлять виджеты, зависящие от этого InheritedWidget
@override
bool updateShouldNotify(MyInheritedWidget oldWidget) {
return oldWidget.counter != counter;
}
}
2. Использование InheritedWidget
в дереве виджетов
Вы можете поместить свой InheritedWidget
выше тех виджетов, которым нужно получить доступ к данным.
class MyHomePage extends StatelessWidget {
final int counter = 0;
@override
Widget build(BuildContext context) {
return MyInheritedWidget(
counter: counter,
child: Scaffold(
appBar: AppBar(
title: Text('InheritedWidget Example'),
),
body: Center(
child: CounterDisplay(),
),
),
);
}
}
class CounterDisplay extends StatelessWidget {
@override
Widget build(BuildContext context) {
final inheritedWidget = MyInheritedWidget.of(context);
final counter = inheritedWidget?.counter ?? 0;
return Text('Counter: $counter');
}
}
3. Обновление данных
Чтобы обновить данные, можно пересоздать InheritedWidget
с новыми значениями. Например, вы можете использовать StatefulWidget
, чтобы управлять состоянием:
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int counter = 0;
void incrementCounter() {
setState(() {
counter++;
});
}
@override
Widget build(BuildContext context) {
return MyInheritedWidget(
counter: counter,
child: Scaffold(
appBar: AppBar(
title: Text('InheritedWidget Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CounterDisplay(),
ElevatedButton(
onPressed: incrementCounter,
child: Text('Increment'),
),
],
),
),
),
);
}
}
Когда использовать InheritedWidget
- Если данные или состояние должны быть доступны нескольким виджетам в дереве.
- Когда производительность важна, так как
InheritedWidget
обновляет только те виджеты, которые зависят от изменяемых данных.
Если требуется более продвинутое управление состоянием, можно рассмотреть такие решения, как flutter_bloc
, Provider
, states_rebuilder
или Riverpod
, которые предлагают более высокоуровневые абстракции.