В чем разница Provider и MultiProvider во Flutter
Что проверяют
Понимаете ли вы, что MultiProvider не отдельный механизм, а удобная запись вложенных провайдеров. Следом обычно спрашивают про разницу watch, read и select или про то, почему виджет не перестраивается.
Как отвечать
Речь о пакете provider: это обёртка над InheritedWidget, которая передаёт объекты вниз по дереву и управляет их жизненным циклом. Если вы пришли из веба, ближайшая аналогия это Context в React.
Provider: кладёт в дерево одно значение и сам не слушает его изменения. Для изменяемого состояния берутChangeNotifierProvider,StreamProviderилиFutureProvider;MultiProvider: принимает списокprovidersи разворачивает его в ту же вложенную цепочку. Поведение идентично ручной вложенности, выигрыш только в читаемости, когда провайдеров пять, а не один;- порядок в списке: провайдер ниже по списку видит те, что выше. На этом работает
ProxyProvider, который собирает объект из других провайдеров, например репозиторий из API-клиента и токена; - жизненный цикл: конструктор с
createсоздаёт объект лениво (по умолчаниюlazy: true) и сам вызываетdispose. Конструктор.valueберёт готовый объект и не освобождает его.
Чтение: context.watch<T>() подписывает виджет на изменения, context.read<T>() берёт значение без подписки и нужен в обработчиках нажатий, context.select перестраивает виджет только при изменении нужного поля. Для точечных перестроек есть Consumer и Selector.
Стоит упомянуть, что автор provider развивает Riverpod, где состояние не привязано к BuildContext, и в новых проектах часто выбирают его.
Где спотыкаются
Кладут ChangeNotifier в обычный Provider. Такой провайдер не реагирует на notifyListeners, и в debug-сборке пакет прямо выбрасывает исключение с подсказкой взять ChangeNotifierProvider.
Получают ProviderNotFoundException, читая провайдер в том же build, где он создан: context там выше провайдера. Помогает Builder или вынос виджета.
Создают объект через .value прямо в build: ChangeNotifierProvider.value(value: Counter()). Каждая перестройка даёт новый экземпляр, состояние теряется, старый никто не освобождает.