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 — 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.
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 — 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ág | Típus | Leírás |
|---|---|---|
| connectionState | ConnectionState | A kapcsolat aktuális állapota (none, waiting, active, done) |
| data | T? | A Future-től kapott adatok (null a befejezésig vagy hiba esetén) |
| error | Object? | A hiba objektum, ha a Future kivétellel fejeződött be |
| hasData | bool | true, ha a data nem null és az állapot ConnectionState.done |
| hasError | bool | true, ha a Future hiba mellett fejeződött be |
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.
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.
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.
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 é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.
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.
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
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.
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.
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.
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.
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
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.
Olvassa el is