FutureBuilder — bu, ötürülən Future-dən alınan AsyncSnapshot-in cari vəziyyətinə əsasən interfeysini avtomatik yenidən quran Flutter vidjetidir. Await-dən sonra əl ilə setState çağırmaqdan fərqli olaraq, FutureBuilder deklarativ yanaşma təmin edir: ilk renderdə Future-ə abunə olur və hər vəziyyət dəyişikliyində — yükləmə, xəta və ya hazır məlumat — builder funksiyasını çağırır. Flutter API Reference (2026)-ə görə, FutureBuilder şəbəkədən məlumat yükləmək, verilənlər bazasından oxumaq və UI-nin yükləmə göstəricisi, xəta mesajı və ya hazır məzmun göstərməli olduğu istənilən asinxron əməliyyatlar üçün xüsusilə faydalıdır.
Əsas məqamlar
FutureBuilder — bu, widgets paketindən Future<T> və builder funksiyasını qəbul edən daxili Flutter vidjetidir. Future vəziyyəti dəyişdikdə (icra olunur, məlumatla tamamlanır, xəta ilə tamamlanır) FutureBuilder avtomatik olaraq UI-ni yenidən qurur, builder-i yeni AsyncSnapshot ilə çağırır. Bu, setState və bayraqlar vasitəsilə yükləmə vəziyyətini əl ilə idarə etmək ehtiyacını aradan qaldırır.
Məlumat axınları (Stream) ilə işləyən StreamBuilder-dən fərqli olaraq, FutureBuilder təkrar olunmayan asinxron əməliyyatlar üçün nəzərdə tutulub: HTTP sorğusu, fayldan oxuma, verilənlər bazası sorğusu. FutureBuilder Future-ə abunəliyi özü idarə edir: ilk qurulmada Future-i işə salır və onun tamamlanmasını izləyir. Vidjet məhv edildikdə FutureBuilder Future-i ləğv etmir — bu, tərtibatçının məsuliyyətidir.
Flutter Cookbook (2026)-ə görə, FutureBuilder asinxron əməliyyatın ekranın inisiallaşdırılması zamanı bir dəfə işə salındığı hallar üçün tövsiyə olunur. Təkrarlanan əməliyyatlar və ya məlumat axınları üçün StreamBuilder istifadə edin. Hər iki vidjet Reactive UI nümunəsinə əməl edir, lakin FutureBuilder təkrar sorğular üçün optimallaşdırılıb.
FutureBuilder-in daxili tətbiqi Future.then və catchError vasitəsilə Future-ə abunə olur. Başlanğıcda FutureBuilder connectionState-i ConnectionState.waiting-ə təyin edir və builder-i boş məlumatlarla çağırır. Uğurlu tamamlanmada connectionState məlumatlarla ConnectionState.done-a dəyişir. Xəta olduqda snapshot.error xəta obyekti ilə doldurulur. Hər dəyişiklik vidjetin yenidən qurulmasını tetikler.
AsyncSnapshot — FutureBuilder-in hər vəziyyət dəyişikliyində builder funksiyasına ötürdüyü konteyner obyektidir. O, asinxron əməliyyatın cari statusu haqqında bütün məlumatları ehtiva edir: yükləmə davam edirmi, hansı məlumatlar alınıb, xəta baş veribmi. AsyncSnapshot-u başa düşmək FutureBuilder ilə UI-nin düzgün qurulmasının açarıdır.
| Xüsusiyyət | Tip | Təsvir |
|---|---|---|
| connectionState | ConnectionState | Cari əlaqə vəziyyəti (none, waiting, active, done) |
| data | T? | Future-dən alınan məlumat (tamamlanana qədər və ya xəta olduqda null) |
| error | Object? | Future istisna ilə tamamlandıqda xəta obyekti |
| hasData | bool | data null deyilsə və vəziyyət ConnectionState.done-dursa true |
| hasError | bool | Future xəta ilə tamamlandıqda true |
Enum ConnectionState asinxron əməliyyatın mərhələsini müəyyən edir. None — Future hələ işə salınmadıqda başlanğıc vəziyyət (nadir hallarda, adətən initialData olmadan ilk qurulmada istifadə olunur). Waiting — Future icra olunur, məlumat hələ alınmayıb. Active — yalnız StreamBuilder tərəfindən qismən məlumatlı axınlar üçün istifadə olunur. Done — Future tamamlandı, məlumat snapshot.data və ya xəta snapshot.error vasitəsilə əlçatandır.
Builder funksiyasında AsyncSnapshot-un bütün vəziyyətlərinin düzgün idarə olunması istehsal kodu üçün məcburi tələbdir. Əgər waiting vəziyyətini idarə etməsəniz, istifadəçi yükləmə zamanı boş ekran görəcək. Əgər hasError-ı idarə etməsəniz, istifadəçi izahsız Exception alacaq. Tövsiyə olunan nümunə: hasError yoxlaması → hasData yoxlaması → standart olaraq yükləmə göstərilməsi.
FutureBuilder bir neçə standart nümunədə istifadə oluna bilər, hər biri konkret tapşırığı həll edir. Əsas ssenariləri nəzərdən keçirək: inisiallaşdırma zamanı məlumat yükləmə, keşlə yükləmə, paralel sorğular və təkrarlama ilə xəta idarəetməsi.
Ən geniş yayılmış nümunə — StatefulWidget və ya StatelessWidget-in build metodunda FutureBuilder. Future initState-dən ötürülür və ya birbaşa build-də yaradılır. Bu zaman Future-i hər yenidən qurulmada build metodunda yaratmamaq vacibdir — bu, təkrar sorğulara səbəb olacaq. State sahəsində saxlanılan Future-dən istifadə edin.
Təkrar sorğuların qarşısını almaq üçün FutureBuilder CachedNetworkImage və ya yerli keşlə birləşdirilə bilər. İlk yükləmədən sonra məlumat yaddaşda və ya SharedPreferences-də saxlanılır, FutureBuilder isə keşlənmiş məlumatı dərhal göstərir, paralel olaraq onu şəbəkədən yeniləyir. Bu, ani cavab verməklə UX-i yaxşılaşdırır.
pub.dev (2026)-yə görə, keşləmə xüsusilə şəkillər və məlumat siyahıları üçün aktualdır. FutureBuilder CachedNetworkImageProvider ilə avtomatik olaraq keşlənmiş şəkli göstərir, olmadıqda isə yükləmə göstəricisi ilə sonra endirilmiş faylı göstərir.
FutureBuilder və setState vasitəsilə əl ilə vəziyyət idarəetməsi — Flutter-də asinxron UI-ə iki yanaşma. Hər birinin üstünlükləri və məhdudiyyətləri var. Seçim ekranın mürəkkəbliyindən və asinxron əməliyyatların sayından asılıdır.
FutureBuilder sadəliyi ilə qalib gəlir: yükləmə vəziyyəti, məlumat və xəta üçün sahələr elan etmək lazım deyil — hər şey AsyncSnapshot vasitəsilə idarə olunur. Bir asinxron əməliyyatı olan sadə ekranlar üçün idealdır (bir HTTP sorğusu, verilənlər bazasından oxuma). Lakin bir ekranda 5+ asinxron əməliyyat olduqda FutureBuilder həddindən artıq iç-içəlik yaradır — iç-içə FutureBuilder-lərdən \u201cpiramida\u201d alınır.
setState əl ilə vəziyyət bayraqları ilə mürəkkəb məntiqdə daha çox nəzarət və oxunaqlılıq verir. Çoxsaylı asılı sorğuları olan ekranlar üçün (istifadəçini yüklə → onun sifarişlərini yüklə → sifariş detallarını yüklə) setState-i ChangeNotifier və ya Bloc ilə istifadə etmək daha yaxşıdır. Flutter State Management Guide (2026)-yə görə, mürəkkəb ssenarilər üçün FutureBuilder əvəzinə Riverpod və ya Bloc istifadə etmək tövsiyə olunur, çünki onlar məntiq və təqdimatın daha yaxşı ayrılmasını təmin edir.
REST API-dən istifadəçi siyahısını yükləmək üçün praktiki FutureBuilder nümunəsini nəzərdən keçirək. Kod AsyncSnapshot-un hər üç vəziyyətinin düzgün idarə olunmasını nümayiş etdirir: yükləmə, xəta və hazır məlumat.
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('İstifadəçilər')),
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('Xəta: ${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());
},
),
);
}
}
Nümunədə FutureBuilder hər üç vəziyyəti idarə edir. Xəta olduqda xəta mesajı ilə ikon göstərilir. Uğurlu yükləmədə — avatarlar və adlarla ListView. Yükləmə zamanı — CircularProgressIndicator. Future sinif sahəsi kimi elan edilib, bu da yenidən qurulmada təkrar çağırışın qarşısını alır. Bu nümunə mobil tətbiqlərdə FutureBuilder istifadə ssenarilərinin 90%-ni əhatə edir.
Tez-tez verilən suallar
FutureBuilder Future vəziyyətinin hər dəyişməsində builder-i çağırır: ilk dəfə yaratmada (connectionState: none və ya waiting), ikinci dəfə tamamlanmada (connectionState: done). Ana vidjet yenidən qurulursa, FutureBuilder də yenidən qurulur. Təkrar çağırışların qarşısını almaq üçün Future-in build metodundan kənarda yaradıldığına əmin olun — əks halda hər build çağırışı yeni Future yaradır.
Future-i StatefulWidget sahəsində (initState-də) saxlayın və ya memoization istifadə edin. Əgər Future build metodunun daxilində yaradılırsa, hər build çağırışı yeni Future yaradacaq və FutureBuilder asinxron əməliyyatı yenidən başladacaq. StatelessWidget üçün cached_future paketindən və ya keep-alive vidjetlərindən istifadə edin ki, Future yenidən qurulmalardan asılı olmayaraq bir dəfə icra olunsun.
FutureBuilder təkrar olunmayan asinxron əməliyyatlar üçün nəzərdə tutulub (bir HTTP sorğusu, verilənlər bazasından bir oxuma). StreamBuilder zamanla çoxsaylı dəyərlər buraxa bilən məlumat axınları ilə işləyir (söhbət, qiymət yeniləmələri, geolokasiya). StreamBuilder qismən məlumatlar üçün ConnectionState.active-i dəstəkləyir, FutureBuilder isə yalnız waiting və done-u dəstəkləyir.
Bir neçə paralel Future üçün Future.wait istifadə edin və nəticəni bir FutureBuilder-ə ötürün. Future.wait Future siyahısını qəbul edir və Future<List> qaytarır — bütün Future-lər tamamlandıqda builder nəticələr massivini alır. Ardıcıl sorğular üçün bir Future daxilində Future.then zəncirindən və ya iç-içə FutureBuilder-lərdən (az oxunaqlı) istifadə edin. Alternativ — çoxsaylı asinxron vəziyyətlər üçün AsyncValue ilə riverpod paketi.
FutureBuilder Future-i avtomatik ləğv etmir. Ləğv etmək üçün async paketindən CancelableOperation və ya State-də cancelled bayrağı vasitəsilə öz mexanizminizi istifadə edin. dispose()-da bayrağı təyin edin, Future tamamlandıqdan sonra isə setState çağırmazdan əvvəl onu yoxlayın. Alternativ olaraq, ekrandan çıxarkən asinxron əməliyyatları avtomatik ləğv edən AutoDispose ilə riverpod paketindən istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun