Что выберешь: Provider или InheritedWidget?

«Что выберешь: Provider или InheritedWidget?» — вопрос из категории State Management, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для большинства задач я выбираю Provider, так как это надстройка над InheritedWidget, которая решает типичные проблемы в пару строк кода.

Provider даёт готовые провайдеры для ChangeNotifier, ValueNotifier, Stream и Future. Он управляет жизненным циклом объектов и оптимизирует перестроения виджетов с помощью context.select. Пример из моего кода:

// Объявление провайдера
ChangeNotifierProvider(
  create: (_) => CartModel(),
  child: const MyApp(),
);

// Использование в виджете
final cart = context.watch<CartModel>(); // Автоматическая подписка
// Или для оптимизации:
final total = context.select((CartModel cart) => cart.totalPrice);

InheritedWidget я использую напрямую только в специфичных случаях, например, для кастомной передачи очень простых данных по дереву или когда нужно максимальное быстродействие без сторонних пакетов. Его реализация требует больше шаблонного кода (объявление класса, статический метод of).

Таким образом, Provider — это стандартный, проверенный инструмент для управления состоянием в средних по сложности Flutter-приложениях, который я применяю постоянно.