Зачем мне нужен InheritedWidget в Flutter

#flutter #widget #inherited-widget

#flutter #виджет #унаследованный-виджет

Вопрос:

Я начал изучать унаследованные виджеты Flutter, и у меня есть вопрос. Зачем нам нужен InheritedWidget, если мы можем получать данные из context.findAncestorOfExactType ? И это updateShouldNotify … Например, он уведомляет дочерние виджеты, когда какое-то условие выполняется, и они в любом случае запускают свои методы сборки после изменения InheritedWidget, потому что он неизменяем, и мы можем изменить его только при некоторой перестройке…

Комментарии:

1. Вы имеете в виду findAncestorWidgetOfExactType?

2. @bluenile да, найдите dancestorwidgetofexacttype и найдите dancestorstateoftype

Ответ №1:

InheritedWidget более полезен для случаев метода сборки. Когда вы хотите получить данные от предка внутри вашего метода сборки.

Из API Flutter: https://api.flutter.dev/flutter/widgets/BuildContext/findAncestorStateOfType.html

Это не должно использоваться из методов сборки, потому что контекст сборки не будет перестроен, если изменится значение, которое будет возвращено этим методом. В общем, dependOnInheritedWidgetOfExactType больше подходит для таких случаев. Этот метод полезен для одноразового изменения состояния виджета-предка, например, для того, чтобы вызвать список прокрутки предка для прокрутки виджета этого контекста сборки в поле зрения или для перемещения фокуса в ответ на взаимодействие с пользователем.

Кроме того, делая то, что вы упомянули, вы объединяете виджеты вместе, что вообще не является хорошей практикой. Известно, что виджеты могут перемещаться с места на место без особых изменений.

Есть много полезных вещей, которые приходят из унаследованного виджета. Некоторые из этих вещей являются очень полезными пакетами, я рекомендую вам взглянуть на них.

Вы также можете взглянуть на документацию InheritedWidget

Комментарии:

1. Не могли бы вы, пожалуйста, привести пример кода, в котором мы будем обновлять значение в каком-либо виджете, но его дочерний элемент (или дочерний элемент его дочернего элемента, в любом случае это должен быть виджет, который размещен ниже в дереве) не будет перестроен с новым значением? Я пытался привести несколько примеров, как я уже сказал, но каждый раз дочерний виджет перестраивался с новым значением от его предка (значение было передано из context.findWidgetOfExactType())