Как правильно использовать 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, которые предлагают более высокоуровневые абстракции.