Provider: co to je, správce stavu Flutter aplikací

Autor: IT Sectr Publikováno: 2026-02-19 Doba čtení: 7 min

Provider — balíček pro správu stavu pro Flutter, vytvořený Rémim Rousseletem v roce 2019 jako obal nad InheritedWidget. Provider řeší problém předávání dat dolů stromem widgetů bez props drilling: jakýkoli widget získá přístup ke stavu pomocí context.read<T>() nebo context.watch<T>(). Podle pub.dev je Provider nejoblíbenější správce stavu Flutter s více než 25 tisíci like.

Hlavní

  • ChangeNotifier — třída s notifyListeners pro informování odběratelů o změně
  • Consumer — widget, který se přestaví při změně ChangeNotifier
  • MultiProvider — kompozice několika Providerů bez vnořování
  • ProxyProvider — Provider závislý na jiném Provideru
  • context.read / context.watch — metody čtení stavu bez a s odběrem

Co je to Provider?

Provider — balíček pro správu stavu a vkládání závislostí ve Flutter, postavený na InheritedWidget. Provider zpřístupňuje objekt (stav, službu, úložiště) ve stromu widgetů a automaticky přestaví UI při změně dat. Na rozdíl od přímého použití InheritedWidget, Provider odstraňuje veškerý boilerplate.

Provider je oficiálně doporučený Googlem způsob správy stavu ve Flutter (Flutter Team, 2019-2023). Podle Flutter Community Survey 2025 se Provider používá v 72% Flutter aplikací.

ChangeNotifier a notifyListeners

ChangeNotifier — vestavěná třída Flutter implementující vzor Listener. ChangeNotifier informuje odběratele o změně pomocí volání notifyListeners().

Dart
class CounterProvider extends ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void reset() {
    _count = 0;
    notifyListeners();
  }
}

Pravidla notifyListeners: volejte po úplné změně dat — ne uprostřed metody, ale na konci. Při více změnách volejte notifyListeners() jednou po všech změnách.

Consumer a context.watch

Consumer — widget, který se přihlásí k odběru ChangeNotifier a přestaví se při každém volání notifyListeners().

Dart
Consumer<CounterProvider>(
  builder: (context, provider, child) => Column(
    children: [
      child!, // nepřestavuje se
      Text('${provider.count}'),
      ElevatedButton(
        onPressed: () => provider.increment(),
        child: Icon(Icons.add),
      ),
    ],
  ),
  child: Text('Počítadlo:'),
)

context.watch — rozšiřující metoda BuildContext pro přihlášení k odběru Provideru. context.read — přístup bez odběru. context.select — odběr konkrétního pole modelu.

MultiProvider a ProxyProvider

MultiProvider — widget pro registraci několika Providerů bez vnořování. ProxyProvider — Provider závislý na jiném Provideru.

Dart
MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => CartProvider()),
    ChangeNotifierProvider(create: (_) => AuthProvider()),
    ProxyProvider<AuthProvider, OrderProvider>(
      update: (_, auth, __) => OrderProvider(auth.userId),
    ),
  ],
  child: MaterialApp(home: HomePage()),
)

Testování Provideru

Provider se testuje zabalením widgetu do MultiProvider s testovacími hodnotami.

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: výkon a omezení

Výkon Provideru je založen na InheritedWidget: při změně Provideru se všechny widgety přihlášené prostřednictvím context.watch nebo Consumer přestaví. Použijte context.select, Consumer s parametrem child a const pro statické widgety.

MetodaOdběrPřestavěníPoužití
context.watchCelý modelJakákoli změnaJednoduché widgety
ConsumerCelý modelJakákoli změnaS child optimalizací
context.selectKonkrétní polePouze při změně poleSložité modely
context.readŽádnýNikdyHandlery událostí

Často kladené otázky

Čím se Provider liší od BLoC?

Provider — obal nad InheritedWidget pro vkládání závislostí s ChangeNotifier. BLoC — architektonický vzor s Event + Stream pro izolaci logiky.

Co je ChangeNotifierProvider?

ChangeNotifierProvider — typ Provideru pro instance ChangeNotifier. Vytváří objekt pomocí create, zpřístupňuje jej potomkům a přestaví Consumer při volání notifyListeners.

Jak se vyhnout zbytečnému přestavění s Providerem?

Použijte context.select místo context.watch. Rozdělte velké ChangeNotifier na několik malých.

Lze použít Provider bez ChangeNotifier?

Ano. Provider pro neměnné objekty. StreamProvider pro streamy. FutureProvider pro Future. ProxyProvider pro Provider závislé na jiných.

Co je ProviderNotFoundException?

ProviderNotFoundException — výjimka za běhu, která nastane při pokusu o získání Provideru, který není deklarován výše ve stromu widgetů.

Shrnutí

  • Provider — obal nad InheritedWidget pro správu stavu a DI ve Flutter
  • ChangeNotifier — třída s notifyListeners pro reaktivní aktualizaci UI
  • Consumer a context.watch — odběr změn s automatickým přestavěním
  • MultiProvider — kompozice providerů bez vnořování stromu
  • ProxyProvider — řetěz závislostí mezi Providery
  • context.select — bodový odběr konkrétního pole modelu
  • StreamProvider a FutureProvider — vestavěná podpora pro reaktivní a asynchronní data

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také