FutureBuilder — wat is het, werken met Future in Flutter

Auteur: IT Sectr Gepubliceerd: 2026-07-02 Leestijd: 8 min

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 — Flutter widget voor het bouwen van UI op basis van Future-status via AsyncSnapshot (none, waiting, active, done)
  • AsyncSnapshot — object dat de huidige status van een asynchrone bewerking bevat: connectionState, data en error
  • builder — callback-functie die bij elke statuswijziging van de Future wordt aangeroepen om de UI te herbouwen
  • Foutafhandeling — AsyncSnapshot.hasError maakt het mogelijk een reserve-interface weer te geven bij een mislukte asynchrone bewerking
  • ConnectionState — enum met vier waarden: none (geen bewerking), waiting (wachten), active (stream), done (voltooid)

Wat is FutureBuilder in Flutter

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.

Hoe FutureBuilder onder de motorkap werkt

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: statussen en eigenschappen

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.

EigenschapTypeBeschrijving
connectionStateConnectionStateHuidige verbindingsstatus (none, waiting, active, done)
dataT?Gegevens ontvangen van de Future (null tot voltooiing of bij fout)
errorObject?Foutobject als de Future is voltooid met een uitzondering
hasDatabooltrue als data niet null is en de status ConnectionState.done is
hasErrorbooltrue als de Future is voltooid met een fout

ConnectionState: vier statussen van een asynchrone bewerking

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.

Patronen voor het gebruik van FutureBuilder

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.

Gegevens laden bij initialisatie van het scherm

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.

Laden met caching en vernieuwen

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 vs setState: wat te kiezen

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.

Voorbeeld FutureBuilder met laden van gegevens uit netwerk

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.

dart
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

Waarom roept FutureBuilder de builder meerdere keren aan?

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.

Hoe voorkom ik een herhaald verzoek bij herbouw?

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.

Wat is het verschil tussen FutureBuilder en StreamBuilder?

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.

Hoe gebruik ik FutureBuilder met meerdere Futures?

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.

Hoe annuleer ik een Future bij het verlaten van het scherm?

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

  • FutureBuilder — Flutter widget voor het declaratief bouwen van UI op basis van Future-status via AsyncSnapshot (waiting, done, error)
  • AsyncSnapshot — container met connectionState, data en error; verplicht voor correcte afhandeling van alle asynchrone bewerkingsstatussen
  • builder — callback met drie takken: hasError (fout tonen), hasData (gegevens tonen), default (laadindicator)
  • FutureBuilder vs setState — FutureBuilder eenvoudiger voor één bewerking, setState met Bloc/Riverpod beter voor complexe logica met meerdere verzoeken
  • Voorkomen van herhaalde verzoeken — Future moet een State-veld zijn, maak het niet aan in de build-methode om herstart bij elke herbouw te voorkomen
  • Annuleren van Future — FutureBuilder annuleert Future niet bij dispose; gebruik CancelableOperation of een annuleringsvlag om setState na vernietiging te voorkomen
  • Meerdere Futures — gebruik Future.wait met één FutureBuilder voor parallelle verzoeken; ketens in één Future voor sequentiële

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.

Bespreek het project

Lees ook