Basisprincipes van het Provider-pakket
Leer het Provider-pakket te gebruiken, een populaire Flutter-oplossing voor eenvoudig en schaalbaar statebeheer in uw applicatie.
Basisprincipes van het Provider-pakket is een gratis Mobiele ontwikkeling met Flutter-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Mobiele ontwikkeling met Flutter. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Mobiele ontwikkeling met Flutter bevat in totaal 4 lessen.
Wat is Provider?
Het pakket Provider is een populaire en eenvoudige oplossing voor statusbeheer in Flutter. Het is gebouwd boven op Flutter's eigen InheritedWidget, waardoor het efficiënt en gemakkelijk te begrijpen is.
Het helpt je gegevens en status in je widgetboom te delen zonder complexe callbacks of prop drilling.
De gegevenshouder: ChangeNotifier
Centraal in Provider staat de klasse ChangeNotifier. Je breidt deze klasse uit voor elk object dat status bevat die je wilt delen.
Wanneer je status verandert, roep je notifyListeners() aan om alle widgets die luisteren te laten weten dat ze opnieuw moeten worden opgebouwd.
import 'package:flutter/material.dart';
// 1. Extend ChangeNotifier
class MyCounter extends ChangeNotifier {
int _count = 0; // Private state variable
// Getter to access the count
int get count => _count;
// Method to modify state and notify listeners
void increment() {
_count++;
notifyListeners(); // Important! Triggers UI updates
}
}Status beschikbaar maken
Om je instantie van ChangeNotifier beschikbaar te maken voor widgets, gebruik je een ChangeNotifierProvider. Je wikkelt hiermee een deel van je widgetboom (meestal je hele app) in.
De callback create levert een instantie van je statusobject.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// Our state class from before
class MyCounter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
void main() {
runApp(
// Wrap the app with ChangeNotifierProvider
ChangeNotifierProvider(
create: (context) => MyCounter(), // Create an instance
child: MyApp(), // The widget tree that can access MyCounter
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Provider Setup')),
body: Center(
child: Text(
'MyCounter is now provided!',
style: TextStyle(fontSize: 24),
),
),
),
);
}
}Luisteren naar het opnieuw opbouwen van de interface
De meest gebruikelijke manier waarop een widget naar statuswijzigingen luistert en zijn interface opnieuw opbouwt, is met context.watch. Deze methode maakt de widget afhankelijk van de geleverde status.
Wanneer notifyListeners() wordt aangeroepen, wordt elke widget die watch gebruikt opnieuw opgebouwd.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyCounter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => MyCounter(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 1. Use context.watch<MyCounter>() to get the current state
// This widget will rebuild when MyCounter changes.
final counter = context.watch<MyCounter>();
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Watch for Changes')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${counter.count}', // Display the count
style: TextStyle(fontSize: 32),
),
SizedBox(height: 20),
// Button to increment (action will be added next)
ElevatedButton(
onPressed: () {
// How to trigger increment? See next scene!
},
child: Text('Increment (Not yet connected)'),
),
],
),
),
),
);
}
}Acties zonder opnieuw opbouwen
Soms moet je toegang hebben tot statusmethoden (zoals increment()), maar wil je niet dat de widget opnieuw wordt opgebouwd. Gebruik hiervoor context.read.
Hiermee krijg je eenmalig toegang tot het statusobject, zonder een luisterrelatie te maken.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyCounter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => MyCounter(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counter = context.watch<MyCounter>(); // Listen for UI updates
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Read for Actions')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${counter.count}',
style: TextStyle(fontSize: 32),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 1. Use context.read<MyCounter>() to get the instance
// 2. Call the increment method
context.read<MyCounter>().increment();
},
child: Text('Increment Counter'),
),
],
),
),
),
);
}
}Alternatief voor eenmalige toegang
Voordat context.read beschikbaar was, was Provider.of de gebruikelijke manier om toegang tot status te krijgen zonder te luisteren.
Het werkt precies zoals context.read, maar read heeft vaak de voorkeur omdat het beknopter is. Beide zijn geschikt voor gebeurtenisafhandelaars zoals onPressed.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyCounter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => MyCounter(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counter = context.watch<MyCounter>(); // UI listens
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Provider.of(listen: false)')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${counter.count}',
style: TextStyle(fontSize: 32),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Use Provider.of with listen: false for one-time access
Provider.of<MyCounter>(context, listen: false).increment();
},
child: Text('Increment Counter (using Provider.of)'),
),
],
),
),
),
);
}
}Gericht opnieuw opbouwen met Consumer
De widget Consumer is een andere manier om naar statuswijzigingen te luisteren. In tegenstelling tot context.watch(), dat de hele widget opnieuw opbouwt, bouwt Consumer alleen zijn directe kind opnieuw op (de functie builder).
Dit kan nuttig zijn voor de prestaties als slechts een klein deel van een grote widget op statuswijzigingen hoeft te reageren.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyCounter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => MyCounter(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Consumer Widget')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'This text does NOT rebuild.',
style: TextStyle(fontSize: 20, color: Colors.grey),
),
SizedBox(height: 20),
// Only the Text widget inside Consumer rebuilds
Consumer<MyCounter>(
builder: (context, counter, child) {
print('Consumer rebuilt!'); // See this in console
return Text(
'Count: ${counter.count}',
style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold),
);
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read<MyCounter>().increment();
},
child: Icon(Icons.add),
),
),
);
}
}Meerdere statussen beschikbaar maken
Bij apps met meerdere onafhankelijke statusobjecten kan het onoverzichtelijk worden om je app met veel ChangeNotifierProviders te omwikkelen. MultiProvider vereenvoudigt dit.
Het ontvangt een lijst met providers, waardoor je widgetboom overzichtelijker en gemakkelijker te beheren wordt.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyCounter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
class MyThemeSettings extends ChangeNotifier {
bool _isDark = false;
bool get isDark => _isDark;
void toggleTheme() {
_isDark = !_isDark;
notifyListeners();
}
}
void main() {
runApp(
MultiProvider( // Use MultiProvider for multiple states
providers: [
ChangeNotifierProvider(create: (context) => MyCounter()),
ChangeNotifierProvider(create: (context) => MyThemeSettings()),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Access both states using watch
final counter = context.watch<MyCounter>();
final theme = context.watch<MyThemeSettings>();
return MaterialApp(
theme: theme.isDark ? ThemeData.dark() : ThemeData.light(),
home: Scaffold(
appBar: AppBar(title: Text('MultiProvider Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Count: ${counter.count}', style: TextStyle(fontSize: 28)),
SizedBox(height: 20),
Text('Dark Mode: ${theme.isDark ? "On" : "Off"}', style: TextStyle(fontSize: 28)),
SizedBox(height: 30),
ElevatedButton(
onPressed: () => context.read<MyThemeSettings>().toggleTheme(),
child: Text('Toggle Theme'),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => context.read<MyCounter>().increment(),
child: Icon(Icons.add),
),
),
);
}
}Korte controle over Provider
Wat is het belangrijkste doel van context.read in het pakket Provider?
Samenvatting van de basis van Provider
Je hebt de basis van het pakket Provider geleerd!
ChangeNotifierbevat de status van je applicatie.ChangeNotifierProvidermaakt die status beschikbaar.context.watchluistert naar statuswijzigingen en bouwt de interface opnieuw op.() context.readgebruikt status voor acties zonder de interface opnieuw op te bouwen.() Provider.of(listen: false)is een ouder alternatief voorread.Consumermaakt gericht opnieuw opbouwen van de interface mogelijk.MultiProviderhelpt meerdere statusobjecten overzichtelijk te beheren.
Provider is een krachtig en flexibel hulpmiddel voor het beheren van status in je Flutter-apps!
Leer Dart met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 22
- Lessen
- 88
Veelgestelde vragen
Is de les “Basisprincipes van het Provider-pakket” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Mobiele ontwikkeling met Flutter, waaronder “Basisprincipes van het Provider-pakket”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Mobiele ontwikkeling met Flutter bevat in totaal 4 lessen.
Wat leer ik in “Basisprincipes van het Provider-pakket”?
Leer het Provider-pakket te gebruiken, een populaire Flutter-oplossing voor eenvoudig en schaalbaar statebeheer in uw applicatie. Je oefent met Mobiele ontwikkeling met Flutter door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Mobiele ontwikkeling met Flutter te beginnen?
Ervaring vooraf is niet nodig. Mobiele ontwikkeling met Flutter op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Basisprincipes van het Provider-pakket”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Mobiele ontwikkeling met Flutter?
Ja. Elke les over Mobiele ontwikkeling met Flutter bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- setState en InheritedWidget
- Basisprincipes van het Provider-pakket
- Riverpod voor statebeheer
- Het BLoC-patroon met Streams