Provider — een pakket voor toestandsbeheer voor Flutter, gemaakt door Rémi Rousselet in 2019 als een wrapper over InheritedWidget. Provider lost het probleem van het doorgeven van gegevens in de widgetboom zonder props drilling op: elke widget krijgt toegang tot de toestand via context.read<T>() of context.watch<T>(). Volgens pub.dev is Provider de populairste toestandsmanager van Flutter met meer dan 25 duizend vind-ik-leuks.
Belangrijkste
Provider — een pakket voor toestandsbeheer en afhankelijkheidsinjectie in Flutter, gebouwd bovenop InheritedWidget. Provider biedt een object (toestand, service, repository) in de widgetboom en herbouwt automatisch de UI bij gegevenswijziging. In tegenstelling tot direct gebruik van InheritedWidget verwijdert Provider alle boilerplate.
Provider is officieel aanbevolen door Google voor toestandsbeheer in Flutter (Flutter Team, 2019-2023). Volgens Flutter Community Survey 2025 wordt Provider gebruikt in 72% van de Flutter-applicaties.
ChangeNotifier — ingebouwde Flutter-klasse die het Listener-patroon implementeert. ChangeNotifier stelt abonnees op de hoogte van wijzigingen via de aanroep notifyListeners().
class CounterProvider extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
void reset() {
_count = 0;
notifyListeners();
}
}Regels voor notifyListeners: aanroepen na volledige gegevenswijziging — niet in het midden van de methode, maar aan het einde. Bij meerdere wijzigingen roept u notifyListeners() eenmaal aan na alle wijzigingen.
Consumer — widget die zich abonneert op ChangeNotifier en herbouwt bij elke aanroep van notifyListeners(). Consumer accepteert een builder-functie met drie parameters: context, model, child.
Consumer<CounterProvider>(
builder: (context, provider, child) => Column(
children: [
child!, // wordt niet herbouwd
Text('${provider.count}'),
ElevatedButton(
onPressed: () => provider.increment(),
child: Icon(Icons.add),
),
],
),
child: Text('Teller:'),
)context.watch — BuildContext-extensiemethode om te abonneren op Provider. context.read — toegang zonder abonnement. context.select — abonnement op een specifiek veld van het model.
MultiProvider — widget voor het registreren van meerdere Providers zonder nesting. MultiProvider accepteert een lijst van providers.
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CartProvider()),
ChangeNotifierProvider(create: (_) => AuthProvider()),
ProxyProvider<AuthProvider, OrderProvider>(
update: (_, auth, __) => OrderProvider(auth.userId),
),
],
child: MaterialApp(home: HomePage()),
)ProxyProvider — Provider die afhankelijk is van een andere Provider. StreamProvider en FutureProvider — voor reactieve en asynchrone gegevens.
Provider wordt getest door de widget in te pakken in MultiProvider met testwaarden. Voor de test is geen echte API of database nodig.
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);
},
);
}Prestaties van Provider zijn gebaseerd op InheritedWidget: bij wijziging van Provider worden alle widgets die via context.watch of Consumer zijn geabonneerd, herbouwd. Gebruik context.select, Consumer met child-parameter en const voor statische widgets.
| Methode | Abonnement | Herbouw | Gebruik |
|---|---|---|---|
| context.watch | Volledig model | Elke wijziging | Eenvoudige widgets |
| Consumer | Volledig model | Elke wijziging | Met child-optimalisatie |
| context.select | Specifiek veld | Alleen bij veldwijziging | Complexe modellen |
| context.read | Geen | Nooit | Event-handlers |
Veelgestelde vragen
Provider — een wrapper over InheritedWidget voor afhankelijkheidsinjectie met ChangeNotifier. BLoC — een architectuurpatroon met Event + Stream voor logica-isolatie.
ChangeNotifierProvider — een type Provider voor ChangeNotifier-instanties. Maakt een object via create, stelt het beschikbaar aan descendants en herbouwt Consumer bij aanroep van notifyListeners.
Gebruik context.select in plaats van context.watch. Verdeel grote ChangeNotifiers in meerdere kleine. Gebruik Consumer child voor statische delen.
Ja. Provider voor onveranderlijke objecten. StreamProvider voor streams. FutureProvider voor Future. ProxyProvider voor Providers die afhankelijk zijn van andere.
ProviderNotFoundException — een runtime-uitzondering die optreedt bij het proberen te verkrijgen van een Provider die niet hoger in de widgetboom is gedeclareerd.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook