Сегодня начнем разбирать вопрос про Provider, который нам прислал один прекрасный подписчик. Разработчики provider описывают этот класс как некоторую обертку для InheritedWidget. Чтобы лучше его понять, сегодня вспомним, что такое InheritedWidget и как он работает.
InheritedWidget — виджет, который позволяет передавать некоторые данные дальше по дереву виджетов. При его использовании пропадает необходимость прокидывать данные через конструкторы. Для примера создадим виджет CustomInherited.
class CustomInherited extends InheritedWidget {
const CustomInherited({required this.data, required Widget child})
: super(child: child);
final String data;
static CustomInherited? of(BuildContext context) =>
context.dependOnInheritedWidgetOfExactType<CustomInherited>();
@override
bool updateShouldNotify(CustomInherited oldWidget) => data != oldWidget.data;
}
CustomInherited реализует статический метод
of(context). Под капотом этот метод вызывает context.dependOnInheritedWidgetOfExactType<T>(), который в свою очередь по переданному контексту выполняет поиск самого ближайшего экземпляра виджета типа CustomInherited и возвращает его.Теперь CustomInherited готов к внедрению в дерево виджетов.
CustomInherited(
data: 'inherited data',
child: Container(
padding: const EdgeInsets.all(16),
child: Text(CustomInherited.of(context)?.data ?? ''),
),
),
Так как InheritedWidget предоставляет данные по контексту дальше, то его необходимо располагать выше виджетов, которые должны иметь доступ к его данным. Здесь, например, виджету Text необходимо передать строку из CustomInherited, поэтому инхерит располагаем выше.
По необходимости официальная документация Flutter предлагает создавать два метода —
maybeOf(context) и of(context), где первый возвращает nullable экземпляр, а второй — non-nullable.
static CustomInherited? maybeOf(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<CustomInherited>();
}
static CustomInherited of(BuildContext context) {
final result = maybeOf(context);
assert(result != null, 'No CustomInherited found in context');
return result!;
}
Также InheritedWidget обязует нас переопределять метод
updateShouldNotify. Этот метод возвращает bool значение, которое отвечает за то, должны ли зависимые виджеты пересобираться при изменении данных внутри InheritedWidget.✔️Вот мы и разобрались в основах InheritedWidget. В следующем посте поговорим про Provider.
Делитесь своим опытом работы с InheritedWidget в комментариях.
