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í
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 — vestavěná třída Flutter implementující vzor Listener. ChangeNotifier informuje odběratele o změně pomocí volání notifyListeners().
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 — widget, který se přihlásí k odběru ChangeNotifier a přestaví se při každém volání notifyListeners().
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 — widget pro registraci několika Providerů bez vnořování. ProxyProvider — Provider závislý na jiném Provideru.
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CartProvider()),
ChangeNotifierProvider(create: (_) => AuthProvider()),
ProxyProvider<AuthProvider, OrderProvider>(
update: (_, auth, __) => OrderProvider(auth.userId),
),
],
child: MaterialApp(home: HomePage()),
)Provider se testuje zabalením widgetu do MultiProvider s testovacími hodnotami.
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);
},
);
}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.
| Metoda | Odběr | Přestavění | Použití |
|---|---|---|---|
| context.watch | Celý model | Jakákoli změna | Jednoduché widgety |
| Consumer | Celý model | Jakákoli změna | S child optimalizací |
| context.select | Konkrétní pole | Pouze při změně pole | Složité modely |
| context.read | Žádný | Nikdy | Handlery událostí |
Často kladené otázky
Provider — obal nad InheritedWidget pro vkládání závislostí s ChangeNotifier. BLoC — architektonický vzor s Event + Stream pro izolaci logiky.
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.
Použijte context.select místo context.watch. Rozdělte velké ChangeNotifier na několik malých.
Ano. Provider pro neměnné objekty. StreamProvider pro streamy. FutureProvider pro Future. ProxyProvider pro Provider závislé na jiných.
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í
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í.