FutureBuilder — is een widget in Flutter die automatisch zijn interface herbouwt op basis van de huidige status van AsyncSnapshot, verkregen uit de doorgegeven Future. In tegenstelling tot het handmatig aanroepen van setState na await, biedt FutureBuilder een declaratieve benadering: hij abonneert zich op de Future bij de eerste weergave en roept de builder-functie aan bij elke statuswijziging — laden, fout of gereed. Volgens Flutter API Reference (2026) is FutureBuilder vooral nuttig voor het laden van gegevens uit een netwerk, lezen uit databases en alle asynchrone bewerkingen waarbij de UI een laadindicator, foutmelding of gereed inhoud moet weergeven.
Belangrijkste punten
FutureBuilder — is een ingebouwde Flutter widget uit de widgets-pakket, die Future<T> en een builder-functie accepteert. Wanneer de status van de Future verandert (bezig, voltooid met gegevens, voltooid met fout) herbouwt FutureBuilder automatisch de UI door de builder aan te roepen met een nieuwe AsyncSnapshot. Dit elimineert de noodzaak om handmatig de laadstatus te beheren via setState en vlaggen.
In tegenstelling tot StreamBuilder, die met gegevensstromen (Stream) werkt, is FutureBuilder bedoeld voor eenmalige asynchrone bewerkingen: HTTP-verzoek, lezen uit bestand, databasequery. FutureBuilder beheert zelf het abonnement op de Future: bij de eerste bouw start hij de Future en volgt de voltooiing ervan. Bij het vernietigen van de widget annuleert FutureBuilder de Future niet — dit is de verantwoordelijkheid van de ontwikkelaar.
Volgens Flutter Cookbook (2026) wordt FutureBuilder aanbevolen voor gevallen waarin de asynchrone bewerking eenmalig wordt gestart bij het initialiseren van het scherm. Voor herhaalde bewerkingen of gegevensstromen gebruikt u StreamBuilder. Beide widgets volgen hetzelfde Reactive UI-patroon, maar FutureBuilder is geoptimaliseerd voor eenmalige verzoeken.
De interne implementatie van FutureBuilder abonneert zich op de Future via Future.then en catchError. Bij de start stelt FutureBuilder connectionState in op ConnectionState.waiting en roept de builder aan met lege gegevens. Bij succesvolle voltooiing verandert connectionState in ConnectionState.done met gegevens. Bij een fout wordt snapshot.error gevuld met het foutobject. Elke wijziging triggert het herbouwen van de widget.
AsyncSnapshot — is een containerobject dat FutureBuilder bij elke statuswijziging aan de builder-functie doorgeeft. Het bevat alle informatie over de huidige status van de asynchrone bewerking: of het laden bezig is, welke gegevens zijn ontvangen, of er een fout is opgetreden. Het begrijpen van AsyncSnapshot is de sleutel tot het correct bouwen van UI met FutureBuilder.
| Eigenschap | Type | Beschrijving |
|---|---|---|
| connectionState | ConnectionState | Huidige verbindingsstatus (none, waiting, active, done) |
| data | T? | Gegevens ontvangen van de Future (null tot voltooiing of bij fout) |
| error | Object? | Foutobject als de Future is voltooid met een uitzondering |
| hasData | bool | true als data niet null is en de status ConnectionState.done is |
| hasError | bool | true als de Future is voltooid met een fout |
Enum ConnectionState bepaalt de fase van de asynchrone bewerking. None — beginstatus wanneer de Future nog niet is gestart (zelden gebruikt, meestal bij eerste bouw zonder initialData). Waiting — de Future wordt uitgevoerd, gegevens zijn nog niet ontvangen. Active — wordt alleen gebruikt door StreamBuilder voor streams met gedeeltelijke gegevens. Done — de Future is voltooid, gegevens zijn beschikbaar via snapshot.data of fout via snapshot.error.
Het correct afhandelen van alle AsyncSnapshot-statussen in de builder-functie is een verplichte vereiste voor productiecode. Als u de waiting-status niet afhandelt, ziet de gebruiker een leeg scherm tijdens het laden. Als u hasError niet afhandelt, krijgt de gebruiker een Exception zonder uitleg. Aanbevolen patroon: controleer hasError → controleer hasData → standaard laadindicator tonen.
FutureBuilder kan worden gebruikt in verschillende standaardpatronen, elk gericht op een specifieke taak. Laten we de belangrijkste scenario's bekijken: gegevens laden bij initialisatie, laden met caching, parallelle verzoeken en foutafhandeling met herhaling.
Het meest voorkomende patroon — FutureBuilder in de build-methode van StatefulWidget of StatelessWidget. De Future wordt doorgegeven vanuit initState of direct aangemaakt in build. Het is belangrijk om de Future niet bij elke herbouw in de build-methode aan te maken — dit leidt tot herhaalde verzoeken. Gebruik een Future die is opgeslagen in een State-veld.
Om herhaalde verzoeken te voorkomen, kan FutureBuilder worden gecombineerd met CachedNetworkImage of lokale cache. Na het eerste laden worden gegevens opgeslagen in het geheugen of SharedPreferences, en FutureBuilder toont de gecachete gegevens onmiddellijk, terwijl hij ze parallel uit het netwerk bijwerkt. Dit verbetert de UX door directe respons.
Volgens pub.dev (2026) is caching vooral relevant voor afbeeldingen en gegevenslijsten. FutureBuilder met CachedNetworkImageProvider toont automatisch de gecachete afbeelding, en bij afwezigheid een laadindicator met daaropvolgende weergave van het gedownloade bestand.
FutureBuilder en handmatig statusbeheer via setState — twee benaderingen van asynchrone UI in Flutter. Elk heeft zijn voor- en nadelen. De keuze hangt af van de complexiteit van het scherm en het aantal asynchrone bewerkingen.
FutureBuilder wint in eenvoud: u hoeft geen velden te declareren voor laadstatus, gegevens en fouten — alles wordt beheerd via AsyncSnapshot. Het is ideaal voor eenvoudige schermen met één asynchrone bewerking (één HTTP-verzoek, database lezen). Bij 5+ asynchrone bewerkingen op één scherm creëert FutureBuilder echter overmatige nesting — er ontstaat een „piramide" van geneste FutureBuilders.
setState met handmatige statusvlaggen biedt meer controle en leesbaarheid bij complexe logica. Voor schermen met meerdere afhankelijke verzoeken (gebruiker laden → zijn bestellingen laden → bestelgegevens laden) kunt u beter setState gebruiken met ChangeNotifier of Bloc. Volgens Flutter State Management Guide (2026) wordt voor complexe scenario's aanbevolen om Riverpod of Bloc te gebruiken in plaats van FutureBuilder, omdat ze een betere scheiding van logica en presentatie bieden.
Laten we een praktisch voorbeeld van FutureBuilder bekijken voor het laden van een gebruikerslijst uit een REST API. De code demonstreert de correcte afhandeling van alle drie AsyncSnapshot-statussen: laden, fout en gereed.
class UserListPage extends StatefulWidget {
const UserListPage({super.key});
@override
State<UserListPage> createState() => _UserListPageState();
}
class _UserListPageState extends State<UserListPage> {
final Future<List<User>> usersFuture = UserRepository().fetchUsers();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Users')),
body: FutureBuilder<List<User>>(
future: usersFuture,
builder: (context, AsyncSnapshot<List<User>> snapshot) {
if (snapshot.hasError) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.error_outline, size: 48, color: Colors.red),
const SizedBox(height: 16),
Text('Error: ${snapshot.error}'),
],
),
);
}
if (snapshot.hasData) {
final users = snapshot.data!;
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(
leading: CircleAvatar(backgroundImage: NetworkImage(users[index].avatarUrl)),
title: Text(users[index].name),
subtitle: Text(users[index].email),
);
},
);
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
}
In het voorbeeld handelt FutureBuilder alle drie statussen af. Bij een fout wordt een pictogram met foutmelding weergegeven. Bij succesvol laden — ListView met avatars en namen. Tijdens het laden — CircularProgressIndicator. Future is gedeclareerd als klasseveld, wat herhaald aanroepen bij herbouw voorkomt. Dit patroon dekt 90% van de gebruiksscenario's van FutureBuilder in mobiele applicaties.
Veelgestelde vragen
FutureBuilder roept de builder aan bij elke statuswijziging van de Future: de eerste keer bij aanmaak (connectionState: none of waiting), de tweede keer bij voltooiing (connectionState: done). Als de bovenliggende widget herbouwt, herbouwt FutureBuilder ook. Om herhaalde aanroepen te voorkomen, moet u ervoor zorgen dat de Future buiten de build-methode wordt aangemaakt — anders creëert elke build-aanroep een nieuwe Future.
Sla Future op in het veld van StatefulWidget (in initState) of gebruik memoization. Als de Future binnen de build-methode wordt aangemaakt, creëert elke build-aanroep een nieuwe Future en herstart FutureBuilder de asynchrone bewerking. Gebruik voor StatelessWidget het pakket cached_future of keep-alive widgets zodat de Future eenmalig wordt uitgevoerd, ongeacht herbouwingen.
FutureBuilder is bedoeld voor eenmalige asynchrone bewerkingen (één HTTP-verzoek, één databaselezing). StreamBuilder werkt met gegevensstromen die meerdere waarden in de tijd kunnen emitteren (chat, prijsupdates, geolocatie). StreamBuilder ondersteunt ConnectionState.active voor gedeeltelijke gegevens, terwijl FutureBuilder alleen waiting en done ondersteunt.
Gebruik voor meerdere parallelle Futures Future.wait en geef het resultaat door aan één FutureBuilder. Future.wait accepteert een lijst van Futures en retourneert Future<List> — wanneer alle Futures zijn voltooid, ontvangt de builder een array met resultaten. Voor sequentiële verzoeken gebruik een keten van Future.then binnen één Future of geneste FutureBuilders (minder leesbaar). Een alternatief is het pakket riverpod met AsyncValue voor meerdere asynchrone statussen.
FutureBuilder annuleert de Future niet automatisch. Gebruik voor annulering CancelableOperation uit het async-pakket of uw eigen mechanisme via een cancelled-vlag in State. Stel de vlag in dispose() in en controleer deze na voltooiing van de Future voordat u setState aanroept. Gebruik alternatief het pakket riverpod met AutoDispose, dat automatisch asynchrone bewerkingen annuleert bij het verlaten van het scherm.
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