FutureBuilder — mi ez, munka a Future-rel Flutter-ben

Szerző: IT Sectr Megjelenés: 2026-07-02 Olvasási idő: 8 perc

FutureBuilder — egy widget a Flutter-ben, amely automatikusan átépíti a felületét az átadott Future-ből kapott AsyncSnapshot aktuális állapota alapján. Ellentétben a setState manuális meghívásával await után, a FutureBuilder deklaratív megközelítést kínál: feliratkozik a Future-re az első rendereléskor, és minden állapotváltozáskor meghívja a builder függvényt — betöltés, hiba vagy kész adat. A Flutter API Reference (2026) szerint a FutureBuilder különösen hasznos adatok hálózatról történő betöltéséhez, adatbázisból való olvasáshoz és minden olyan aszinkron művelethez, ahol az UI-nak betöltési jelzőt, hibaüzenetet vagy kész tartalmat kell megjelenítenie.

Főbb pontok

  • FutureBuilder — Flutter widget UI építéséhez a Future állapota alapján AsyncSnapshot-on keresztül (none, waiting, active, done)
  • AsyncSnapshot — objektum, amely az aszinkron művelet aktuális állapotát tartalmazza: connectionState, data és error
  • builder — callback függvény, amely a Future minden állapotváltozásakor meghívásra kerül az UI átépítéséhez
  • Hibakezelés — az AsyncSnapshot.hasError lehetővé teszi egy tartalék felület megjelenítését az aszinkron művelet meghibásodása esetén
  • ConnectionState — enum négy értékkel: none (nincs művelet), waiting (várakozás), active (stream), done (befejezve)

Mi az a FutureBuilder a Flutter-ben

FutureBuilder — egy beépített Flutter widget a widgets csomagból, amely Future<T>-t és egy builder függvényt fogad. Amikor a Future állapota megváltozik (fut, adatokkal befejeződött, hibával befejeződött), a FutureBuilder automatikusan átépíti az UI-t, meghívva a buildert az új AsyncSnapshot-tal. Ez kiküszöböli a betöltési állapot manuális kezelésének szükségességét setState és zászlók segítségével.

Ellentétben a StreamBuilder-rel, amely adatfolyamokkal (Stream) dolgozik, a FutureBuilder egyszeri aszinkron műveletekre készült: HTTP-kérés, fájlból olvasás, adatbázis-lekérdezés. A FutureBuilder maga kezeli a Future-re való feliratkozást: az első felépítéskor elindítja a Future-t és követi annak befejezését. A widget megsemmisítésekor a FutureBuilder nem szakítja meg a Future-t — ez a fejlesztő felelőssége.

A Flutter Cookbook (2026) szerint a FutureBuilder olyan esetekben ajánlott, amikor az aszinkron művelet egyszer fut le a képernyő inicializálásakor. Ismétlődő műveletekhez vagy adatfolyamokhoz használja a StreamBuilder-t. Mindkét widget ugyanazt a Reactive UI mintát követi, de a FutureBuilder az egyszeri kérésekre van optimalizálva.

Hogyan működik a FutureBuilder a motorháztető alatt

A FutureBuilder belső implementációja a Future.then és catchError segítségével iratkozik fel a Future-re. Indításkor a FutureBuilder a connectionState-t ConnectionState.waiting-re állítja, és meghívja a buildert üres adatokkal. Sikeres befejezéskor a connectionState ConnectionState.done-ra változik adatokkal. Hiba esetén a snapshot.error feltöltésre kerül a hiba objektummal. Minden változás kiváltja a widget átépítését.

AsyncSnapshot: állapotok és tulajdonságok

AsyncSnapshot — egy konténer objektum, amelyet a FutureBuilder minden állapotváltozáskor átad a builder függvénynek. Tartalmazza az aszinkron művelet aktuális állapotával kapcsolatos összes információt: folyamatban van-e a betöltés, milyen adatok érkeztek, történt-e hiba. Az AsyncSnapshot megértése a kulcs a FutureBuilder-rel való helyes UI-építéshez.

TulajdonságTípusLeírás
connectionStateConnectionStateA kapcsolat aktuális állapota (none, waiting, active, done)
dataT?A Future-től kapott adatok (null a befejezésig vagy hiba esetén)
errorObject?A hiba objektum, ha a Future kivétellel fejeződött be
hasDatabooltrue, ha a data nem null és az állapot ConnectionState.done
hasErrorbooltrue, ha a Future hiba mellett fejeződött be

ConnectionState: az aszinkron művelet négy állapota

Az enum ConnectionState határozza meg az aszinkron művelet fázisát. None — kezdeti állapot, amikor a Future még nem indult el (ritkán használt, általában az első felépítéskor initialData nélkül). Waiting — a Future fut, az adatok még nem érkeztek meg. Active — csak a StreamBuilder használja részleges adatokat tartalmazó adatfolyamokhoz. Done — a Future befejeződött, az adatok elérhetők a snapshot.data vagy a hiba a snapshot.error segítségével.

Az AsyncSnapshot összes állapotának helyes kezelése a builder függvényben kötelező követelmény a production kódban. Ha nem kezeli a waiting állapotot, a felhasználó üres képernyőt lát a betöltés során. Ha nem kezeli a hasError-t, a felhasználó magyarázat nélküli Exception-t kap. Ajánlott minta: hasError ellenőrzése → hasData ellenőrzése → alapértelmezés szerint betöltés jelzése.

A FutureBuilder használati mintái

FutureBuilder több standard mintában használható, amelyek mindegyike egy adott feladatot old meg. Tekintsük át a fő forgatókönyveket: adatok betöltése inicializáláskor, betöltés gyorsítótárazással, párhuzamos kérések és hibakezelés újrapróbálkozással.

Adatok betöltése a képernyő inicializálásakor

A leggyakoribb minta — FutureBuilder a StatefulWidget vagy StatelessWidget build metódusában. A Future az initState-ből kerül átadásra vagy közvetlenül a build-ben jön létre. Fontos, hogy ne hozzon létre Future-t a build metódusban minden átépítéskor — ez ismétlődő kérésekhez vezet. Használja a State mezőjében tárolt Future-t.

Betöltés gyorsítótárazással és frissítéssel

Az ismétlődő kérések megelőzése érdekében a FutureBuilder kombinálható a CachedNetworkImage-val vagy helyi gyorsítótárral. Az első betöltés után az adatok memóriában vagy SharedPreferences-ben kerülnek tárolásra, és a FutureBuilder azonnal megjeleníti a gyorsítótárazott adatokat, miközben párhuzamosan frissíti azokat a hálózatról. Ez az azonnali válasz által javítja az UX-et.

A pub.dev (2026) szerint a gyorsítótárazás különösen releváns a képek és adatlisták esetében. A FutureBuilder a CachedNetworkImageProvider-rel automatikusan megjeleníti a gyorsítótárazott képet, hiányában pedig betöltési jelzőt a letöltött fájl későbbi megjelenítésével.

FutureBuilder vs setState: melyiket válasszuk

FutureBuilder és a manuális állapotkezelés setState segítségével — két megközelítés az aszinkron UI-hoz Flutter-ben. Mindegyiknek megvannak a maga előnyei és korlátai. A választás a képernyő összetettségétől és az aszinkron műveletek számától függ.

FutureBuilder az egyszerűségében győz: nem kell mezőket deklarálni a betöltési állapothoz, adatokhoz és hibához — mindent az AsyncSnapshot kezel. Ideális egyszerű képernyőkhöz egy aszinkron művelettel (egy HTTP-kérés, adatbázis olvasás). Azonban 5+ aszinkron művelet esetén egy képernyőn a FutureBuilder túlzott egymásba ágyazást hoz létre — „piramis" alakul ki az egymásba ágyazott FutureBuilder-ekből.

setState manuális állapotjelzőkkel több irányítást és olvashatóságot biztosít összetett logika esetén. Több függő kéréssel rendelkező képernyők esetén (felhasználó betöltése → rendeléseinek betöltése → rendelés részleteinek betöltése) jobb a setState használata ChangeNotifier-rel vagy Bloc-kal. A Flutter State Management Guide (2026) szerint összetett forgatókönyvek esetén a FutureBuilder helyett a Riverpod vagy Bloc használata ajánlott, mivel ezek jobb logikai és prezentációs szétválasztást biztosítanak.

FutureBuilder példa adatok betöltésével hálózatról

Tekintsünk egy gyakorlati példát a FutureBuilder használatára felhasználói lista betöltéséhez REST API-ból. A kód bemutatja az AsyncSnapshot mindhárom állapotának helyes kezelését: betöltés, hiba és kész adatok.

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());
        },
      ),
    );
  }
}

A példában a FutureBuilder mindhárom állapotot kezeli. Hiba esetén egy ikon jelenik meg a hibaüzenettel. Sikeres betöltéskor — ListView avatárokkal és nevekkel. Betöltés közben — CircularProgressIndicator. A Future osztálymezőként van deklarálva, ami megakadályozza az ismételt meghívást átépítéskor. Ez a minta lefedi a FutureBuilder használati eseteinek 90%-át mobilalkalmazásokban.

Gyakran Ismételt Kérdések

Miért hívja meg a FutureBuilder többször a buildert?

FutureBuilder minden Future-állapotváltozáskor meghívja a buildert: először a létrehozáskor (connectionState: none vagy waiting), másodszor a befejezéskor (connectionState: done). Ha a szülő widget átépül, a FutureBuilder is átépül. Az ismétlődő meghívások megelőzéséhez győződjön meg arról, hogy a Future a build metóduson kívül jön létre — különben minden build hívás új Future-t hoz létre.

Hogyan akadályozható meg az ismétlődő kérés átépítéskor?

Tárolja a Future-t a StatefulWidget mezőjében (initState-ben) vagy használjon memoizációt. Ha a Future a build metóduson belül jön létre, minden build hívás új Future-t hoz létre, és a FutureBuilder újraindítja az aszinkron műveletet. StatelessWidget esetén használja a cached_future csomagot vagy keep-alive widget-eket, hogy a Future egyszer fusson le az átépítésektől függetlenül.

Miben különbözik a FutureBuilder a StreamBuilder-től?

FutureBuilder egyszeri aszinkron műveletekhez készült (egy HTTP-kérés, egy adatbázis olvasás). StreamBuilder olyan adatfolyamokkal dolgozik, amelyek idővel több értéket bocsáthatnak ki (chat, árfolyamfrissítések, geolokáció). A StreamBuilder támogatja a ConnectionState.active-et részleges adatokhoz, míg a FutureBuilder csak a waiting és done állapotokat támogatja.

Hogyan használjuk a FutureBuilder-t több Future-rel?

Több párhuzamos Future esetén használja a Future.wait-et, és adja át az eredményt egy FutureBuilder-nek. A Future.wait egy Future listát fogad és Future<List>-et ad vissza — amikor az összes Future befejeződött, a builder egy eredménymasszívumot kap. Szekvenciális kérésekhez használjon Future.then láncot egy Future-ben vagy egymásba ágyazott FutureBuilder-eket (kevésbé olvasható). Alternatíva — a riverpod csomag AsyncValue-val többszörös aszinkron állapotokhoz.

Hogyan szakítható meg a Future a képernyő elhagyásakor?

FutureBuilder nem szakítja meg automatikusan a Future-t. A megszakításhoz használja a CancelableOperation-t az async csomagból vagy saját mechanizmust a cancelled zászlón keresztül a State-ben. A dispose()-ban állítsa be a zászlót, majd a Future befejezése után ellenőrizze azt a setState meghívása előtt. Alternatívaként használja a riverpod csomagot AutoDispose-szal, amely automatikusan megszakítja az aszinkron műveleteket a képernyő elhagyásakor.

Összegzés

  • FutureBuilder — Flutter widget deklaratív UI építéséhez a Future állapota alapján AsyncSnapshot-on keresztül (waiting, done, error)
  • AsyncSnapshot — konténer connectionState, data és error mezőkkel; kötelező az aszinkron művelet minden állapotának helyes kezeléséhez
  • builder — callback három ággal: hasError (hiba megjelenítése), hasData (adatok megjelenítése), default (betöltés jelzése)
  • FutureBuilder vs setState — FutureBuilder egyszerűbb egy művelethez, setState Bloc/Riverpod-dal jobb összetett logikához több kéréssel
  • Ismétlődő kérések megelőzése — a Future legyen State mező, ne hozza létre a build metódusban az újraindítás elkerülése érdekében
  • Future megszakítása — FutureBuilder nem szakítja meg a Future-t dispose-kor; használjon CancelableOperation-t vagy megszakítási zászlót a setState megelőzéséhez
  • Több Future — párhuzamos kérésekhez használjon Future.wait-t egy FutureBuilder-rel; szekvenciális kérésekhez — láncokat egy Future-ben

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is