Provider — пакет за управление на състоянието за Flutter, създаден от Rémi Rousselet през 2019 г. като обвивка над InheritedWidget. Provider решава проблема с предаването на данни надолу по дървото от widget-ове без props drilling: всякакъв widget получава достъп до състоянието чрез context.read<T>() или context.watch<T>(). Според pub.dev, Provider е най-популярният мениджър на състоянието на Flutter с повече от 25 хиляди апрекиации.
Основни неща
Provider — пакет за управление на състоянието и инжектиране на зависимости в Flutter, построен върху InheritedWidget. Provider предоставя обект (състояние, услуга, репозиториум) в дървото от widget-ове и автоматично преизгражда UI при промяна на данните. За разлика от директното използване на InheritedWidget, Provider премахва цялата boilerplate.
Provider е официално препоръчан от Google за управление на състоянието в Flutter (Flutter Team, 2019-2023). Според Flutter Community Survey 2025, Provider се използва в 72% от Flutter приложенията.
ChangeNotifier — вграден клас на Flutter, който имплементира модела Listener. ChangeNotifier уведомява абонатите за промяна чрез извикването на notifyListeners().
class CounterProvider extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
void reset() {
_count = 0;
notifyListeners();
}
}Правила на notifyListeners: извиквайте след пълна промяна на данните — не в средата на метода, а в края. При много промяни извиквайте notifyListeners() веднъж след всички промяни.
Consumer — widget, който се абонира за ChangeNotifier и се преизгражда при всяко извикване на notifyListeners().
Consumer<CounterProvider>(
builder: (context, provider, child) => Column(
children: [
child!, // не се преизгражда
Text('${provider.count}'),
ElevatedButton(
onPressed: () => provider.increment(),
child: Icon(Icons.add),
),
],
),
child: Text('Брояч:'),
)context.watch — метод за разширение на BuildContext за абониране към Provider. context.read — достъп без абонамент. context.select — абониране за конкретно поле на модела.
MultiProvider — widget за регистриране на няколко Provider без вложеност. ProxyProvider — Provider, който зависи от друг Provider.
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CartProvider()),
ChangeNotifierProvider(create: (_) => AuthProvider()),
ProxyProvider<AuthProvider, OrderProvider>(
update: (_, auth, __) => OrderProvider(auth.userId),
),
],
child: MaterialApp(home: HomePage()),
)Provider се тества чрез увиване на widget-а в MultiProvider с тестови стойности.
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Counter increments on button tap',
(tester) async {
await tester.pumpWidget(
ChangeNotifierProvider(
create: (_) => CounterProvider(),
child: CounterScreen(),
),
);
await tester.tap(find.byKey(Key('increment')));
await tester.pump();
expect(find.text('1'), findsOneWidget);
},
);
}Производителността на Provider се базира на InheritedWidget: при промяна на Provider всички абонирани чрез context.watch или Consumer widget-ове се преизграждат. Използвайте context.select, Consumer с параметър child и const за статични widget-ове.
| Метод | Абонамент | Преизграждане | Използване |
|---|---|---|---|
| context.watch | Цял модел | Всяка промяна | Прости widget-ове |
| Consumer | Цял модел | Всяка промяна | С child оптимизация |
| context.select | Конкретно поле | Само при промяна на полето | Сложни модели |
| context.read | Няма | Никога | Обработчици на събития |
Често задавани въпроси
Provider — обвивка над InheritedWidget за инжектиране на зависимости с ChangeNotifier. BLoC — архитектурен модел с Event + Stream за изолация на логика.
ChangeNotifierProvider — тип Provider за инстанции на ChangeNotifier. Създава обект чрез create, предоставя го на потомъците и преизгражда Consumer при извикване на notifyListeners.
Използвайте context.select вместо context.watch. Разделете големите ChangeNotifier на няколко малки.
Да. Provider за непроменяеми обекти. StreamProvider за потоци. FutureProvider за Future. ProxyProvider за Provider, които зависят от други.
ProviderNotFoundException — изключение по време на изпълнение, което възниква при опит за получаване на Provider, който не е деклариран по-горе в дървото от widget-ове.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също