Provider: шта је, менаџер стања Flutter апликација

Аутор: IT Sectr Објављено: 2026-02-19 Време читања: 7 мин

Provider — пакет за управљање стањем у Flutter-у, креирао га је Rémi Rousselet 2019. године као овојницу над InheritedWidget. Provider решава проблем преношења података низ дрво виџета без props drilling: сваки виџет добија приступ стању путем context.read<T>() или context.watch<T>(). Према pub.dev, Provider је најпопуларнији менаџер стања Flutter-а са више од 25 хиљада лајкова.

Главно

  • ChangeNotifier — класа са notifyListeners за обавештавање претплатника о промени
  • Consumer — виџет који се поново изграђује при промени ChangeNotifier-а
  • MultiProvider — композиција више Provider-а без угњезђивања
  • ProxyProvider — Provider који зависи од другог Provider-а
  • context.read / context.watch — методе читања стања без и са претплатом

Шта је Provider?

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 и notifyListeners

ChangeNotifier — уграђена Flutter класа која имплементира образац Listener. ChangeNotifier обавештава претплатнике о промени позивом notifyListeners(). Креира се класа која насљеђује ChangeNotifier са пољима и методама који позивају notifyListeners() након промене података.

Dart
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 и context.watch

Consumer — виџет који се претплаћује на ChangeNotifier и поново се изграђује при сваком позиву notifyListeners(). Consumer прихвата builder функцију са три параметра: context, model, child.

Dart
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 и ProxyProvider

MultiProvider — виџет за регистрацију више Provider-а без угњежђивања. MultiProvider прихвата листу провајдера.

Dart
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-а

Provider се тестира умотавањем виџета у MultiProvider са тест вредностима. За тест није потребан прави API или база података.

Dart
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: перформансе и ограничења

Перформансе Provider-а се заснива на InheritedWidget-у: при промени Provider-а, сви виџети претплаћени путем context.watch или Consumer се поново изграђују. Користите context.select, Consumer са параметром child и const за статичке виџете.

МетодаПретплатаПоново изграђујеКоришћење
context.watchЦео моделСвака променаЈедноставни виџети
ConsumerЦео моделСвака променаСа child оптимизацијом
context.selectОдређећено пољеСамо при промени пољаСложени модели
context.readНемаНикадаХендлери догађаја

Често постављена питања

По чему се Provider разликује од BLoC-а?

Provider — овојница над InheritedWidget за убризгавање зависности са ChangeNotifier. BLoC — архитектурни образац са Event + Stream за изолацију логике.

Шта је ChangeNotifierProvider?

ChangeNotifierProvider — тип Provider-а за инстанце ChangeNotifier-а. Креира објект кроз create, ставља га на располагање потомцима и поново изграђује Consumer при позиву notifyListeners.

Како избећи непотребног поновног изграђивања са Provider?

Користите context.select уместо context.watch. Делите велике ChangeNotifier-е на више малих. Користите Consumer child за статичке делове.

Може ли се Provider користити без ChangeNotifier-а?

Да. Provider без ChangeNotifier за непромењиве објекте. StreamProvider за токове. FutureProvider за Future. ProxyProvider за Provider-е зависне од других.

Шта је ProviderNotFoundException?

ProviderNotFoundException — runtime изузетак који настаје при покушају добијања Provider-а који није декларисан више у дрвету виџета.

Закључак

  • Provider — овојница над InheritedWidget за управљање стањем и DI у Flutter-у
  • ChangeNotifier — класа са notifyListeners за реактивно ажурирање UI-ја
  • Consumer и context.watch — претплата на промене са аутоматским поновним изграђивањем
  • MultiProvider — композиција провајдера без угњежђивања дрвета
  • ProxyProvider — ланац зависности између Provider-а
  • context.select — тачкаста претплата на одређећено поље модела
  • StreamProvider и FutureProvider — уграђена подршка за реактивне и асинхроне податке

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође