Provider — пакет за управљање стањем у Flutter-у, креирао га је Rémi Rousselet 2019. године као овојницу над InheritedWidget. Provider решава проблем преношења података низ дрво виџета без props drilling: сваки виџет добија приступ стању путем context.read<T>() или context.watch<T>(). Према pub.dev, Provider је најпопуларнији менаџер стања Flutter-а са више од 25 хиљада лајкова.
Главно
Provider — пакет за управљање стањем и убризгавање зависности у Flutter-у, изграђен изнад InheritedWidget-а. Provider омогућуће приступ објекту (стање, сервис, репозиторијум) у дрвету виџета и аутоматски поново изграђује UI при промени података. За разлику од директног коришћења InheritedWidget-а, Provider уклања сав boilerplate: није потребно писати подкласу InheritedWidget-а, конфигурисати статичку методу of() и управљати угњежђивањем.
Provider је званично препоручен од стране Google-а начин управљања стањем у Flutter-у (Flutter Team, 2019-2023). Пакет је део Flutter Ecosystem-а и га подржава Flutter тим. Према Flutter Community Survey 2025, Provider се користи у 72% Flutter апликација.
ChangeNotifier — уграђена Flutter класа која имплементира образац Listener. ChangeNotifier обавештава претплатнике о промени позивом notifyListeners(). Креира се класа која насљеђује ChangeNotifier са пољима и методама који позивају notifyListeners() након промене података.
class CounterProvider extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
void reset() {
_count = 0;
notifyListeners();
}
}Правила notifyListeners: позивати након потпуне промене података — не у средини методе, већ на крају. Ако метода извршава више промена, позивите notifyListeners() једанпут након свих промена.
Алтернативе за ChangeNotifier: ValueNotifier — за једну вредност, StateNotifier — из пакета state_notifier.
Consumer — виџет који се претплаћује на ChangeNotifier и поново се изграђује при сваком позиву notifyListeners(). Consumer прихвата builder функцију са три параметра: context, model, child.
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 — виџет за регистрацију више Provider-а без угњежђивања. MultiProvider прихвата листу провајдера.
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CartProvider()),
ChangeNotifierProvider(create: (_) => AuthProvider()),
ProxyProvider<AuthProvider, OrderProvider>(
update: (_, auth, __) => OrderProvider(auth.userId),
),
],
child: MaterialApp(home: HomePage()),
)ProxyProvider — Provider који зависи од другог Provider-а. StreamProvider и FutureProvider — за реактивне и асинхроне податке.
Provider се тестира умотавањем виџета у MultiProvider са тест вредностима. За тест није потребан прави API или база података.
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 се поново изграђују. Користите context.select, Consumer са параметром child и const за статичке виџете.
| Метода | Претплата | Поново изграђује | Коришћење |
|---|---|---|---|
| context.watch | Цео модел | Свака промена | Једноставни виџети |
| Consumer | Цео модел | Свака промена | Са child оптимизацијом |
| context.select | Одређећено поље | Само при промени поља | Сложени модели |
| context.read | Нема | Никада | Хендлери догађаја |
Често постављена питања
Provider — овојница над InheritedWidget за убризгавање зависности са ChangeNotifier. BLoC — архитектурни образац са Event + Stream за изолацију логике.
ChangeNotifierProvider — тип Provider-а за инстанце ChangeNotifier-а. Креира објект кроз create, ставља га на располагање потомцима и поново изграђује Consumer при позиву notifyListeners.
Користите context.select уместо context.watch. Делите велике ChangeNotifier-е на више малих. Користите Consumer child за статичке делове.
Да. Provider без ChangeNotifier за непромењиве објекте. StreamProvider за токове. FutureProvider за Future. ProxyProvider за Provider-е зависне од других.
ProviderNotFoundException — runtime изузетак који настаје при покушају добијања Provider-а који није декларисан више у дрвету виџета.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође