FutureBuilder — nedir, Flutter'da Future ile çalışmak

Yazar: IT Sectr Yayınlanma: 2026-07-02 Okuma süresi: 8 dk

FutureBuilder, Flutter'da sağlanan bir Future'den alınan AsyncSnapshot'ın mevcut durumuna göre arayüzünü otomatik olarak yeniden oluşturan bir widget'tır. await'den sonra manuel olarak setState çağırmaktan farklı olarak, FutureBuilder bildirimsel bir yaklaşım sunar: ilk renderda Future'e abone olur ve her durum değişikliğinde — yükleme, hata veya hazır veri — builder fonksiyonunu çağırır. Flutter API Referansı (2026)'na göre FutureBuilder, ağdan veri yükleme, veritabanından okuma ve UI'nın bir yükleme göstergesi, hata mesajı veya hazır içerik görüntülemesi gereken herhangi bir asenkron işlem için özellikle kullanışlıdır.

Önemli Noktalar

  • FutureBuilder — AsyncSnapshot (none, waiting, active, done) aracılığıyla Future durumuna dayalı UI oluşturmak için Flutter widget'ı
  • AsyncSnapshot — asenkron işlemin mevcut durumunu içeren bir nesne: connectionState, data ve error
  • builder — UI'yı yeniden oluşturmak için her Future durum değişikliğinde çağrılan geriçağrım fonksiyonu
  • Hata yönetimi — AsyncSnapshot.hasError, asenkron işlem başarısız olduğunda yedek UI göstermeye izin verir
  • ConnectionState — dört değerli enum: none (işlem yok), waiting (bekliyor), active (akış), done (tamamlandı)

Flutter'da FutureBuilder Nedir

FutureBuilder, widgets paketinden Future ve bir builder fonksiyonu alan yerleşik bir Flutter widget'ıdır. Future'in durumu değiştiğinde (çalışıyor, veriyle tamamlandı, hatayla tamamlandı), FutureBuilder yeni bir AsyncSnapshot ile builder'ı çağırarak UI'yı otomatik olarak yeniden oluşturur. Bu, setState ve bayraklar aracılığıyla yükleme durumunu manuel olarak yönetme ihtiyacını ortadan kaldırır.

Veri akışları (Stream) ile çalışan StreamBuilder'ın aksine, FutureBuilder tek seferlik asenkron işlemler için tasarlanmıştır: HTTP isteği, dosya okuma, veritabanı sorgusu. FutureBuilder, Future aboneliğini kendi yönetir: ilk derlemede Future'i başlatır ve tamamlanmasını izler. Widget yok edildiğinde, FutureBuilder Future'i iptal etmez — bu geliştiricinin sorumluluğundadır.

Flutter Cookbook (2026)'a göre FutureBuilder, ekran başlatılmasında asenkron işlemin bir kez çalıştığı durumlar için önerilir. Tekrarlayan işlemler veya veri akışları için StreamBuilder kullanın. Her iki widget da aynı Reaktif UI desenini izler, ancak FutureBuilder tek seferlik istekler için optimize edilmiştir.

FutureBuilder'ın Dahili Çalışması

FutureBuilder'ın dahili uygulaması, Future'e Future.then ve catchError kullanarak abone olur. FutureBuilder başladığında, connectionState'i ConnectionState.waiting olarak ayarlar ve boş veriyle builder'ı çağırır. Başarılı tamamlanmada, connectionState veriyle ConnectionState.done'a değişir. Hatada, snapshot.error hata nesnesiyle doldurulur. Her değişiklik widget yeniden oluşturmayı tetikler.

AsyncSnapshot: Durumlar ve Özellikler

AsyncSnapshot, FutureBuilder'ın her durum değişikliğinde builder fonksiyonuna ilettiği bir kapsayıcı nesnedir. Asenkron işlemin mevcut durumu hakkında tüm bilgileri içerir: yükleme devam ediyor mu, hangi veriler alındı veya bir hata oluştu mu. AsyncSnapshot'ı anlamak, FutureBuilder ile UI'yı doğru şekilde oluşturmanın anahtarıdır.

ÖzellikTürAçıklama
connectionStateConnectionStateMevcut bağlantı durumu (none, waiting, active, done)
dataT?Future'den alınan veri (tamamlanana kadar veya hatada null)
errorObject?Future bir istisna ile tamamlandıysa hata nesnesi
hasDatabooldata null değilse ve connectionState ConnectionState.done ise true
hasErrorboolFuture bir hatayla tamamlandıysa true

ConnectionState: Asenkron İşlemin Dört Durumu

ConnectionState enum'ı, asenkron işlemin aşamasını tanımlar. None — Future henüz başlatılmamış başlangıç durumu (nadiren kullanılır, genellikle initialData olmadan ilk derlemede). Waiting — Future çalışıyor, veri henüz alınmadı. Active — yalnızca StreamBuilder tarafından kısmi verili akışlar için kullanılır. Done — Future tamamlandı, veri snapshot.data veya hata snapshot.error aracılığıyla kullanılabilir.

Builder fonksiyonunda tüm AsyncSnapshot durumlarının doğru şekilde işlenmesi, üretim kodu için zorunlu bir gerekliliktir. waiting durumunu işlemezseniz, kullanıcı yükleme sırasında boş bir ekran görecektir. hasError'ı işlemezseniz, kullanıcı açıklama olmadan bir İstisna alacaktır. Önerilen desen: hasError'ı kontrol et → hasData'yı kontrol et → varsayılan olarak yüklemeyi göster.

FutureBuilder Kullanım Desenleri

FutureBuilder birkaç standart desende kullanılabilir, her biri belirli bir görevi çözer. Ana senaryolara bakalım: başlatmada veri yükleme, önbellekle yükleme, paralel istekler ve yeniden denemeyle hata yönetimi.

Ekran Başlatmada Veri Yükleme

En yaygın desen — StatefulWidget veya StatelessWidget'ın build metodunda FutureBuilder. Future, initState'den iletilir veya doğrudan build'de oluşturulur. Future'i her yeniden derlemede build metodunda oluşturmamak önemlidir — bu tekrarlayan isteklere yol açacaktır. State alanında saklanan bir Future kullanın.

Önbellek ve Yenileme ile Yükleme

Tekrarlayan istekleri önlemek için, FutureBuilder CachedNetworkImage veya yerel bir önbellekle birleştirilebilir. İlk yüklemeden sonra veri bellekte veya SharedPreferences'te saklanır ve FutureBuilder, ağdan paralel olarak güncellerken önbelleğe alınmış veriyi anında görüntüler. Bu, anında yanıt sayesinde kullanıcı deneyimini iyileştirir.

pub.dev (2026)'ya göre önbellekleme özellikle görseller ve veri listeleri için önemlidir. CachedNetworkImageProvider ile FutureBuilder, önbelleğe alınmış görseli otomatik olarak görüntüler ve olmadığında — indirilen dosyanın ardından bir yükleme göstergesi gösterir.

FutureBuilder vs setState: Hangisini Seçmeli

FutureBuilder ve setState aracılığıyla manuel durum yönetimi, Flutter'da asenkron UI'ya iki yaklaşımdır. Her birinin avantajları ve sınırlamaları vardır. Seçim, ekran karmaşıklığına ve asenkron işlem sayısına bağlıdır.

FutureBuilder basitlikte kazanır: yükleme durumu, veri ve hata için alan bildirmeniz gerekmez — her şey AsyncSnapshot aracılığıyla yönetilir. Tek asenkron işlemi (bir HTTP isteği, veritabanı okuma) olan basit ekranlar için idealdir. Ancak, bir ekranda 5+ asenkron işlem olduğunda, FutureBuilder aşırı iç içe geçme yaratır — sonuçta iç içe FutureBuilder'lardan oluşan bir “Piramit” oluşur.

Manuel durum bayraklarıyla setState, karmaşık mantık için daha fazla kontrol ve okunabilirlik sağlar. Birden çok bağımlı isteği olan ekranlar (kullanıcıyı yükle → siparişlerini yükle → sipariş detaylarını yükle) için ChangeNotifier veya Bloc ile setState kullanmak daha iyidir. Flutter Durum Yönetimi Kılavuzu (2026)'na göre karmaşık senaryolarda FutureBuilder yerine Riverpod veya Bloc önerilir, çünkü mantık ve sunumun daha iyi ayrıştırılmasını sağlarlar.

Ağ Verisi Yükleme ile FutureBuilder Örneği

Bir REST API'den kullanıcı listesi yüklemek için pratik bir FutureBuilder örneğini inceleyelim. Kod, AsyncSnapshot'ın üç durumunun (yükleme, hata ve hazır veri) doğru şekilde işlenmesini gösterir.

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('Kullanıcılar')),
      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('Hata: ${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());
        },
      ),
    );
  }
}

Örnekte, FutureBuilder üç durumu da işler. Hatada, hata mesajı içeren bir simge görüntülenir. Başarılı yüklemede — avatar ve isimlerle ListView. Yükleme sırasında — CircularProgressIndicator. Future bir sınıf alanı olarak bildirilir, bu da yeniden derlemede tekrarlanan çağrıyı önler. Bu desen, mobil uygulamalarda FutureBuilder kullanım senaryolarının %90'ını kapsar.

Sıkça Sorulan Sorular

FutureBuilder builder'ı neden birden çok kez çağırır?

FutureBuilder, Future durum değişikliğinde builder'ı çağırır: ilk kez oluşturmada (connectionState: none veya waiting), ikinci kez tamamlamada (connectionState: done). Ebeveyn widget yeniden oluşturulursa, FutureBuilder da yeniden oluşturulur. Tekrarlanan çağrıları önlemek için Future'in build metodu dışında oluşturulduğundan emin olun — aksi halde her build çağrısı yeni bir Future oluşturur.

Yeniden derlemede tekrarlayan istek nasıl önlenir?

Future'i StatefulWidget alanında (initState'te) saklayın veya belleğe alma kullanın. Future build metodu içinde oluşturulursa, her build çağrısı yeni bir Future oluşturacak ve FutureBuilder asenkron işlemi yeniden başlatacaktır. StatelessWidget için, yeniden derlemelerden bağımsız olarak Future'in bir kez çalışması için cached_future paketini veya keep-alive widget'larını kullanın.

FutureBuilder StreamBuilder'dan nasıl farklıdır?

FutureBuilder tek seferlik asenkron işlemler (bir HTTP isteği, bir veritabanı okuma) için tasarlanmıştır. StreamBuilder zaman içinde birden çok değer yayabilen veri akışları (sohbet, fiyat güncellemeleri, coğrafi konum) ile çalışır. StreamBuilder kısmi veri için ConnectionState.active'i desteklerken, FutureBuilder yalnızca waiting ve done'ı destekler.

Birden çok Future ile FutureBuilder nasıl kullanılır?

Birden çok paralel Future için Future.wait kullanın ve sonucu tek bir FutureBuilder'a iletin. Future.wait bir Future listesi alır ve Future döndürür — tüm Future'ler tamamlandığında, builder bir sonuç dizisi alır. Sıralı istekler için, bir Future içinde Future.then zinciri veya iç içe FutureBuilder'lar (daha az okunabilir) kullanın. Bir alternatif, birden çok asenkron durum için AsyncValue ile riverpod paketidir.

Ekrandan çıkarken Future nasıl iptal edilir?

FutureBuilder Future'i otomatik olarak iptal etmez. İptal etmek için async paketinden CancelableOperation veya State'te iptal edildi bayrağı aracılığıyla özel bir mekanizma kullanın. Bayrağı dispose()'ta ayarlayın ve setState'i çağırmadan önce Future tamamlandıktan sonra kontrol edin. Alternatif olarak, ekrandan çıkarken asenkron işlemleri otomatik olarak iptal eden AutoDispose ile riverpod paketini kullanın.

Özet

  • FutureBuilder — AsyncSnapshot (waiting, done, error) aracılığıyla Future durumuna dayalı bildirimsel UI oluşturma için Flutter widget'ı
  • AsyncSnapshot — connectionState, data ve error içeren kapsayıcı; tüm asenkron işlem durumlarının doğru işlenmesi için gerekli
  • builder — üç dallı geriçağrım: hasError (hata göster), hasData (veri göster), default (yükleme göstergesi)
  • FutureBuilder vs setState — FutureBuilder tek işlem için daha basit, setState + Bloc/Riverpod birden çok istekli karmaşık mantık için daha iyi
  • Tekrarlayan istekleri önleme — Future bir State alanı olmalıdır, her yeniden derlemede yeniden başlatmayı önlemek için build metodunda oluşturmayın
  • Future iptali — FutureBuilder dispose'ta Future'i iptal etmez; yok etme sonrası setState'i önlemek için CancelableOperation veya iptal bayrağı kullanın
  • Birden çok Future — paralel istekler için tek FutureBuilder ile Future.wait kullanın; sıralı için — tek Future'de zincirler

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun