setState() — özü, çalışma mekanizması ve uygulaması

Yazar: IT Sectr Yayınlanma: 2026-07-01 Okuma süresi: 9 dk

setState(), Flutter'da State'in ana yöntemidir, framework'e veri değişikliklerini bildirir ve arayüz yeniden yapımını tetikler. Resmi Flutter belgelerine (Flutter.dev, 2026) göre, setState StatefulWidget'daki ana reaktivite mekanizmasıdır: çağrılmazsa, UI State alanlarındaki değişiklikleri bilmez ve önceki durumunda kalır. Yöntem bir VoidCallback kabul eder, içinde geliştirici değiştirilebilir alanları değiştirir, ardından Flutter widget'ı yeniden oluşturmak için otomatik olarak build'i çağırır.

Önemli Noktalar

  • setState() — widget'ı kirli (dirty) olarak işaretleyen ve sonraki karede UI yeniden yapımını planlayan bir State yöntemi
  • Callback — setState bir VoidCallback kabul eder, içinde UI'ı etkileyen tüm State alan değişiklikleri yapılmalıdır
  • Eşzamansızlık — setState içindeki setTimeout veya Future eşzamanlılığı garanti etmez; await sonrası mutasyonlar başka bir setState içinde olmalıdır
  • Performans — her setState çağrısı tüm widget'ı yeniden oluşturur; en aza indirmek için const alt widget'lar kullanın
  • mounted — eşzamansız callback'lerde setState'i çağırmadan önce her zaman mounted'ı kontrol edin, aksi halde — istisna

setState() nedir?

setState(), Flutter'da State sınıfının yerleşik bir yöntemidir, framework'e widget'ın iç durumunun değiştiğini ve UI'ın yeniden oluşturulması gerektiğini bildirmek için tasarlanmıştır. setState çağrılmazsa, Flutter değişiklikleri bilmez — State alanları değiştirilmiş olsa bile, ebeveyn tarafından bir sonraki zorunlu yeniden yapıma kadar arayüz değişmeden kalır.

Yöntem imzası: void setState(VoidCallback fn). Callback, setState içinde eşzamanlı olarak yürütülür ve yalnızca tamamlandıktan sonra State kirli olarak işaretlenir. Bu, yeniden yapımdan önce tüm değişikliklerin atomik olarak uygulanmasını garanti eder. Dart Dil Belirtimi'ne (Dart Team, 2026) göre, setState'in atomikliği, build'in kısmen güncellenmiş bir durumu görebileceği yarış koşullarını önler.

setState argüman almaz, değer döndürmez ve geçersiz kılınamaz. State sınıfının final (mühürlü) bir yöntemidir. Geliştirici davranışını değiştiremez — yalnızca amaçlandığı gibi kullanabilir. State dışından (örneğin, başka bir sınıftan) setState çağırmaya çalışmak imkansızdır çünkü yöntem State sınıfında bildirilmiştir.

setState durumu değiştirmez — siz değiştirirsiniz

setState'in kendisinin durumu değiştirdiğini düşünmek yaygın bir yanılgıdır. Bu doğru değildir. setState yalnızca iletilen callback'i çağırır (içinde geliştirici alanları değiştirir) ve ardından framework'e build ihtiyacını bildirir. Callback zorunludur — null veya boş bir callback iletmek hataya neden olur.

setState() nasıl çalışır?

setState()'in çalışma mekanizması dört aşamaya ayrılabilir. Birinci — callback ile yöntemi çağırma. İkinci — callback'in eşzamanlı yürütülmesi, içinde State alanları değiştirilir. Üçüncü — State özel bir alan olan _dirty'de kirli olarak işaretlenir. Dördüncü — mevcut mikro görevin sonunda, Flutter tüm kirli öğeleri yineler ve ağaçta görünme sırasına göre build'lerini çağırır.

Önemli bir detay: setState hemen build'i çağırmaz. Flutter toplu güncelleme stratejisi kullanır: tüm kirli öğeler toplanır ve tek bir karede yeniden oluşturulur. Bu, setState tek bir eşzamanlı blok içinde birden çok kez çağrılırsa, build'in yalnızca bir kez yürütüleceği anlamına gelir — tüm değişiklikler tamamlandıktan sonra. Bu optimizasyon, kare başına birden çok yeniden yapımı önler.

Flutter Engine Team'e (Google, 2025) göre, kirli bayrak mekanizması BuildOwner._dirtyElements geçişine dayanır. Her kirli StatefulElement listeye eklenir ve kare güncelleme aşamasında işlenir. İşlemeden önce bir widget ağaçtan kaldırılmışsa, otomatik olarak kirli öğeler listesinden çıkarılır.

setState garantileri

  • Callback, kirli işaretlemeden önce eşzamanlı olarak yürütülür
  • build, kare başına en fazla bir kez çağrılır (birden çok setState çağrısıyla bile)
  • UI güncellemesi sonraki karede gerçekleşir (genellikle 60 FPS'de ~16ms)
  • dispose'dan sonra setState çağırmak yasaktır — istisna fırlatır
  • build sırasında setState çağırmak yasaktır — sonsuz döngü

Dart kod örnekleri

Sayaç artırma ile temel setState() örneği. Doğru kullanımı gösterir: callback içinde alan değiştirme:

dart
class _CounterState extends State<CounterWidget> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++; // callback içinde alanı değiştirme
    });
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _increment,
      child: Text('$_count'),
    );
  }
}

Metin alanı ve denetleyici ile örnek — parola görünürlük yönetimi için setState():

dart
class _PasswordFieldState extends State<PasswordField> {
  bool _obscured = true;
  final _controller = TextEditingController();

  void _toggleVisibility() {
    setState(() {
      _obscured = !_obscured;
    });
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      obscureText: _obscured,
      decoration: InputDecoration(
        suffixIcon: IconButton(
          icon: Icon(_obscured ? Icons.visibility : Icons.visibility_off),
          onPressed: _toggleVisibility,
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

Bu örnekte, setState() yalnızca boolean alanı _obscured değiştirir, bu da yeni bir simge ve görüntüleme moduyla TextField yeniden yapımını tetikler. Metin denetleyicisi yeniden oluşturulmaz — initState'te bir kez başlatılır ve dispose'da serbest bırakılır.

Tek setState'te birden çok mutasyon

Birden çok alanı değiştirmeniz gerekiyorsa, tüm değişiklikler tek bir setState içinde yapılmalıdır. Bu, build'in tutarlı bir durum görmesini garanti eder:

dart
setState(() {
  _isLoading = false;
  _items = newItems;
  _error = null;
});

Bir callback'te üç alan değiştirilir — build bir kez yürütülür ve tüm değişiklikleri aynı anda görür. Her çağrı ayrı bir setState olsaydı, build yine de kirli öğelerin toplu işlenmesi sayesinde yalnızca bir kez yürütülürdü.

Eşzamansızlık ve setState

setState()'in en önemli nüanslarından biri, eşzamansız işlemlerdeki davranışıdır. setState callback'i eşzamanlı olarak yürütülür, ancak içinde await çağrılırsa, await sonrası kod, setState işini tamamladıktan sonra yürütülür. Bu, await sonrası alan değişikliklerinin mevcut setState tarafından yakalanmayacağı anlamına gelir.

Doğru yaklaşım: eşzamansız işlem setState dışında gerçekleştirilir ve setState tamamlandıktan sonra çağrılır. Sonucu alma ile setState'i çağırma arasındaki tüm kod, await sonrası eşzamanlı bağlamda çalışır:

dart
// DOĞRU: await setState dışında
Future<void> _loadData() async {
  final result = await ApiService.fetchData();
  setState(() {
    _data = result;
    _isLoading = false;
  });
}

// YANLIŞ: await setState içinde — güncelleme garantisi yok
void _loadDataWrong() {
  setState(() async {
    _data = await ApiService.fetchData(); // setState await tamamlanmadan döner
    _isLoading = false; // bu kod setState tarafından yakalanmadı
  });
}

Flutter belgelerine (Dart async patterns, 2026) göre, setState'e eşzamansız callback iletmek bir anti-kalıptır çünkü setState bir VoidCallback (eşzamanlı işlev) beklerken, eşzamansız işlev yok sayılan bir Future döndürür. Böyle bir callback'teki ilk await sonrası değişiklikler, framework tarafından doğru şekilde işlenmeyecektir.

Eşzamansız senaryolarda mounted kontrolü

Eşzamansız bir işlemden sonra setState()'i çağırmadan önce her zaman mounted'ı kontrol edin:

dart
if (mounted) {
  setState(() => _data = data);
}

Eşzamansız işlem sırasında widget ağaçtan kaldırıldıysa, mounted false olur ve setState çağrılmaz. Bu, istisnaları ve kaynak sızıntılarını önler.

Performans ve optimizasyon

setState() kullanışlı ancak düşüncesizce kullanılırsa potansiyel olarak pahalı bir mekanizmadır. Her setState çağrısı, tüm widget'ı ve tüm alt öğelerini (const değillerse) yeniden oluşturur. Derin ağaçlarda veya sık çağrılarla bu, FPS düşüşlerine yol açabilir.

Ana optimizasyon stratejileri: yeniden yapım alanını en aza indirin (değiştirilebilir UI parçalarını ayrı StatefulWidget'lara çıkarın), değişmez alt öğeler için const kullanın ve yalnızca küçük bir UX detayı değiştiyse üst widget'larda setState çağırmaktan kaçının. Durum yüksek frekansta güncelleniyorsa (animasyon, veri akışı), AnimatedBuilder veya ValueListenableBuilder'ı değerlendirin.

Flutter Performans En İyi Uygulamalarına (Flutter.dev, Şubat 2026) göre, gerçek uygulamaların profillenmesi, tüm setState çağrılarının %40'a kadarının const alt widget'lar veya reaktif oluşturucular (StreamBuilder, FutureBuilder) ile değiştirilebileceğini göstermektedir. Bu, ortalama kare oluşturma süresini %15–25 oranında azaltır.

setState'in gereksiz olduğu durumlar

SenaryoAlternatifAvantaj
AnimasyonAnimatedBuilderYalnızca animasyonlu widget'ı yeniden oluşturur
Veri akışıStreamBuilderHer akış öğesine tepki verir
Gelecek sonuçFutureBuilderYükleme/hata durumlarını yönetir
Yerel değerValueListenableBuilderTek değer değişikliklerine tepki verir

setState alternatifleri

setState()'in çok yönlülüğüne rağmen, büyük projelerde temel olarak yerel durum için kullanılır. Global veya paylaşılan durum için, her biri setState'i değiştiren veya saran özelleştirilmiş çözümler kullanılır.

Provider, setState'in benzeri olarak ChangeNotifier + notifyListeners kullanır, ancak birden çok widget'ı abone etme yeteneğiyle. Bloc, Streams kullanır — durum, StreamController'a olay eklenerek değiştirilir. Riverpod, yaklaşımları birleştirerek StatefulWidget'a bağlanmadan hem yerel (StateProvider) hem de eşzamansız (AsyncNotifier) yönetim sağlar. Her üç yaklaşım da manuel olarak setState çağırma ihtiyacını ortadan kaldırır — veri değiştiğinde UI güncellemeleri otomatik olarak gerçekleşir.

Flutter Topluluk Anketi 2025'e (Flutter Foundation, Aralık 2025) göre, geliştiricilerin %74'ü setState dışında en az bir durum yönetim aracı kullanmaktadır. Aynı zamanda, %92'si metin alanları, onay kutuları veya basit sayaçların yerel verileri için setState kullanmaya devam etmektedir — bu en iyi uygulama olarak kabul edilir.

setState ne zaman korunmalı

  • Durum yalnızca bir widget tarafından kullanılıyorsa
  • Basit boolean veya sayısal değer (odak, görünürlük, sayaç)
  • Prototip oluşturma ve hızlı deneyler
  • Denetleyiciler (TextEditingController, PageController) hala StatefulWidget gerektirir

Yaygın hatalar

İlk ve en tehlikeli hata, dispose'dan sonra setState'i çağırmaktır. initState'te başlatılan eşzamansız bir işlem, kullanıcı ekrandan ayrıldı, widget kaldırıldı ve eşzamansız callback setState'i çağırır — uygulama bir istisna ile çöker. Çözüm — çağırmadan önce her zaman mounted'ı kontrol edin.

İkinci hata, build içinde setState'i çağırmaktır. Bu, sonsuz bir döngüye yol açar: build → setState → kirli → build → setState → ... Flutter böyle bir çağrıyı engellemez (StackOverflowError alırsınız). setState yalnızca bir olaya yanıt olarak çağrılabilir (düğmeye basma, Future tamamlanması, akıştan veri).

Üçüncü hata, setState'i çağırmadan State alanlarını değiştirmektir. Geliştirici _count++ yazar ve UI'ın güncellenmesini bekler. Flutter, alan değişikliklerini otomatik olarak izleyemez — setState aracılığıyla açık bir sinyale ihtiyaç duyar. Bu, veri değişikliklerinin otomatik olarak güncellemeleri tetiklediği Vue.js gibi reaktif framework'lerden temel bir farktır.

Dördüncü hata, setState'i eşzamansız bir callback (async lambda) ile çağırmaktır. Eşzamansızlık bölümünde açıklandığı gibi, await sonrası değişiklikler yakalanmaz ve yeniden oluşturulması zor hatalara yol açar. Eşzamanlı bir callback kullanın ve await sonrasında setState'i çağırın.

Güvenli setState kontrol listesi

  • Eşzamansız callback'lerde her zaman mounted kontrol edin
  • build içinde setState çağırmayın
  • setState'e async lambda iletmeyin
  • State alanlarını setState dışında değiştirmeyin
  • Birden çok alan değiştiriyorsanız — tek bir setState'te yapın

Sıkça Sorulan Sorular

Flutter'da setState() ne yapar?

setState(), StatefulWidget'ın iç verilerinin değiştiğini ve UI'ın yeniden oluşturulması gerektiğini Flutter'a bildirir. Yöntem bir callback kabul eder, onu eşzamanlı olarak yürütür, widget'ı kirli olarak işaretler ve sonraki karede build'i çağırmayı planlar.

Bir alanı değiştirdikten sonra setState'i çağırmazsam ne olur?

UI güncellenmez. Flutter, alan değişikliklerini otomatik olarak izlemez. Alan değeri bellekte değişir, ancak widget, ebeveyn tarafından bir sonraki zorunlu yeniden yapıma kadar önceki durumunda kalır.

Build içinde setState çağrılabilir mi?

Hayır. Bu, sonsuz bir döngüye yol açar: build setState'i çağırır, setState widget'ı kirli olarak işaretler ve tekrar build'i çağırır. Flutter bu durumu engellemez — uygulama StackOverflowError ile çöker.

Ardışık iki setState çağrısıyla build kaç kez yürütülür?

Build bir kez yürütülür. Flutter tüm kirli öğeleri toplar ve karenin sonunda bunları toplu olarak yeniden oluşturur. İşlemeden önceki ikinci setState, basitçe öğeyi aynı kirli öğeler listesine ekler — tekrarlanan yeniden yapım gerçekleşmez.

mounted nedir ve setState için neden önemlidir?

mounted, widget'ın hala ağaçta olduğunu gösteren bir boolean bayrağıdır. mounted kontrol edilmeden eşzamansız bir işlemden sonra setState çağrılırsa ve widget zaten kaldırılmışsa — uygulama “setState called after dispose” istisnası ile çöker.

Özet

  • setState() — Flutter'a veri değişikliklerini bildiren ve sonraki karede UI yeniden yapımını tetikleyen bir State yöntemi
  • Çalışma mekanizması — eşzamanlı callback yürütme, State'i kirli olarak işaretleme, kare sonunda tüm kirli öğelerin toplu yeniden yapımı
  • Eşzamansızlık — setState'te async callback'ler çalışmaz; await dışarıda olmalı ve sonuç alındıktan sonra setState
  • mounted — istisnaları önlemek için eşzamansız işlemlerde setState'ten önce zorunlu kontrol
  • Optimizasyon — const alt widget'lar aracılığıyla yeniden yapım alanını en aza indirin ve animasyonları AnimatedBuilder'a taşıyın
  • Alternatifler — global durum için Riverpod, Bloc veya Provider kullanın; yerel veriler için setState'i koruyun
  • Kural — build içinde setState çağırmayın, async lambda iletmeyin, her zaman mounted kontrol edin

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