StatelessWidget, Flutter arayüzünün, oluşturulduktan sonra iç durumu depolamayan veya değiştirmeyen temel bir yapı taşıdır. Resmi Flutter dokümantasyonuna (Flutter.dev, 2026) göre, StatelessWidget tipik bir uygulamadaki tüm widget'ların %70'ine kadarını oluşturur, çünkü statik veri sunumundan sorumludur: metin, simgeler, resimler, dolgu ve kaplar. StatefulWidget'ın aksine, yapı tanımı başlatma sırasında bir kez çağrılır ve üst öğe yeniden oluşturulana kadar değişmeden kalır.
Önemli Noktalar
StatelessWidget, değiştirilebilir verilere bağlı olmayan kullanıcı arayüzünün bir bölümünü tanımlamak için tasarlanmış Flutter çerçevesindeki bir sınıftır. StatefulWidget'ın aksine, StatelessWidget'ın iç durumu yoktur, kullanıcı girişine yanıt vermez ve kendini güncellemez. Tek görevi, giriş parametrelerini (kurucu aracılığıyla) kabul etmek ve build yöntemi aracılığıyla bir arayüz tanımı döndürmektir.
Flutter dokümantasyonuna (Flutter.dev, Mart 2026) göre, StatelessWidget, iletilen parametrelere göre hesaplanabilen ve dahili olarak eşzamansız işlemler veya olay işleme gerektirmeyen tüm arayüz öğeleri için kullanılmalıdır. Tipik örnekler: metin gösterme (Text), simgeler (Icon), dolgu (Padding), hizalama (Center) ve kaplar (Container).
StatelessWidget ve StatefulWidget arasında seçim yaparken, minimum yeterlilik ilkesi uygulanır — bir widget durum olmadan çalışabiliyorsa, StatelessWidget olmalıdır. Bu, çerçeve üzerindeki yükü azaltır ve hata ayıklamayı basitleştirir.
StatelessWidget üç senaryoda idealdir: veriler kurucu parametreleri aracılığıyla iletildiğinde ve değişmediğinde, widget diğer statik widget'ların bir birleşimi olduğunda ve yalnızca bir kerelik UI oluşturma gerektiğinde. Bir örnek, kurucu aracılığıyla ad ve avatar alan ProfileHeader widget'ıdır — oluşturulduktan sonra, üst öğe yeniden oluşturulana kadar değişmez. Bu, gerçek projelerde UI'ın çoğunu kapsar.
StatelessWidget'ın ana sınırlaması, kendi içinde doğrudan eşzamansız işlemler (HTTP istekleri, veritabanı okumaları) gerçekleştirememesidir. Bu tür senaryolar için, bir StatefulWidget veya harici durum yönetimi (Riverpod, Bloc, Provider) ile StatelessWidget kombinasyonu gereklidir. StatelessWidget'ın yaşam döngüsü yöntemleri yoktur, bu nedenle başlatma, abonelik ve kaynak serbest bırakma kodu içinde mevcut değildir.
StatelessWidget'ın çalışma mekanizması tek bir yönteme dayanır — build(BuildContext context). Flutter bir StatelessWidget görüntülemesi gerektiğinde, çerçeve bu yöntemi çağırır ve ona geçerli BuildContext'i — widget'ın ağaçtaki konumunu — iletir. Yöntem, Flutter'ın daha sonra ekranda işlediği alt widget'ların (ayrıca StatelessWidget veya StatefulWidget) bir ağacını döndürür.
StatefulWidget'da setState'e yanıt olarak build birden çok kez çağrılabilirken, StatelessWidget'ın build yöntemi yalnızca widget ilk kez ağaca eklendiğinde veya üst öğe parametrelerini değiştirdiğinde çağrılır. Flutter, son build çağrısından bu yana widget'ın değişip değişmediğini belirlemek için bir mutabakat (reconciliation) mekanizması kullanır. Parametreler değişmemişse (ve widget const olarak bildirilmişse), Flutter yeniden oluşturmayı atlar — bu önemli bir optimizasyon mekanizmasıdır.
Google I/O 2025'teki (Flutter Engineering Team, Mayıs 2025) Flutter ekibinin sunumuna göre, mimari doğru şekilde düzenlenirse StatefulWidget'daki build çağrılarının %60'a kadarı StatelessWidget ile değiştirilebilir. Google ekibi, durumu yukarı taşımayı (State Hoisting) ve verileri kurucular aracılığıyla aşağı aktarmayı önererek durumlu widget sayısını en aza indirmeyi tavsiye eder.
Dahili olarak, StatelessWidget tek bir soyut yöntem build ve bir statik yöntem canUpdate içeren soyut bir sınıftır; bu yöntem, mevcut bir öğenin aynı türde ve aynı anahtarla yeni bir widget ile güncellenip güncellenemeyeceğini kontrol eder. runtimeType ve key eşleşirse, Flutter yeni bir öğe oluşturmak yerine mevcut öğeyi günceller — bu, verimli işlemenin temelidir.
Değişmezlik (Immutability), StatelessWidget'ı StatefulWidget'dan ayıran temel bir özelliktir. StatelessWidget'ın tüm alanları final değiştiricisi ile bildirilmelidir ve değerler kurucuda ayarlanır. Örnek oluşturulduktan sonra hiçbir alan değiştirilemez — bu, widget'ın oluşturulduğunda iletilen aynı verileri her zaman görüntülemesini garanti eder.
Bu yaklaşım, bir işlevin aynı argümanlar için her zaman aynı sonucu döndürdüğü işlevsel programlama paradigmasını izler. Flutter, işlemeyi optimize etmek için değişmezliği kullanır: iki StatelessWidget örneği aynı türe ve aynı parametrelere sahipse, çerçeve build sonucunu önbelleğe alabilir ve tekrar çağırmayabilir. Pratikte bu, birçok benzer öğe içeren listelerde %40'a varan performans iyileştirmesi sağlar.
Değişmezlik ayrıca hata ayıklamayı da basitleştirir — geliştirici, kurucusuna bakarak widget'ın hangi verileri görüntülediğini her zaman bilir. Durum içeriden değiştirilemez, bu nedenle tüm arayüz değişiklikleri, üst öğenin yeni parametrelerle yeniden oluşturulması yoluyla gerçekleşir.
finalconst)final olmadan List) iletmeyinKullanıcı bilgilerini görüntüleyen temel bir StatelessWidget örneğine bakalım. Sınıf, kurucu aracılığıyla bir ad ve yaş kabul eder ve metin ve stiller içeren bir widget döndürür:
class UserInfoCard extends StatelessWidget {
final String name;
final int age;
const UserInfoCard({
super.key,
required this.name,
required this.age,
});
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text('Ad: $name', style: TextTheme.of(context).titleLarge),
Text('Yaş: $age', style: TextTheme.of(context).bodyMedium),
],
),
),
);
}
}
Performansı artırmak için bir const kurucu kullanma örneği. Üst widget her build'de aynı parametreleri iletirse, const Flutter'ın yeniden oluşturmayı tamamen atlamasına olanak tanır:
class StaticList extends StatelessWidget {
const StaticList({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: const [
ListTile(leading: Icon(Icons.star), title: Text('Öğe 1')),
ListTile(leading: Icon(Icons.star), title: Text('Öğe 2')),
ListTile(leading: Icon(Icons.star), title: Text('Öğe 3')),
],
);
}
}
Bu örnekte, tüm alt ListTile, Icon ve Text sabit örneklerdir. Flutter bunları bir kez oluşturur ve her üst güncellemesinde yeniden kullanır, bu da çöp toplayıcı üzerindeki yükü önemli ölçüde azaltır.
StatelessWidget ve StatefulWidget arasında seçim yapmak, Flutter ile geliştirme yaparken temel bir mimari karardır. Temel fark, durumun varlığında yatar: StatelessWidget durumunu değiştiremez, StatefulWidget değiştirebilir. Ancak, bundan yaşam döngüsü, performans ve mimari açısından daha derin farklılıklar ortaya çıkar.
StatefulWidget, widget'ın tüm yaşam döngüsü boyunca var olan ayrı bir State nesnesi oluşturur. Bu, initState içinde başlatma, didChangeDependencies içinde veri akışlarına abonelik ve dispose içinde kaynakların serbest bırakılmasını sağlar. StatelessWidget bu yöntemlerin hiçbirini sağlamaz — varlığı build çağrısıyla başlar ve biter.
| Özellik | StatelessWidget | StatefulWidget |
|---|---|---|
| Durum | Yok | Var (State aracılığıyla) |
| build çağrıları | Bir kez (veya üst değiştiğinde) | Birden çok (setState + üst) |
| initState | Hayır | Evet |
| dispose | Hayır | Evet |
| const kurucu | Önerilir | Sınırlı |
| Performans | Yüksek | Daha düşük (State nedeniyle) |
Google Play'deki Flutter uygulamalarının analizine (Flutter Team, Eylül 2025) göre, StatelessWidget'ın baskın olduğu projeler, widget'ların çoğunun StatefulWidget olduğu projelere kıyasla %20-25 daha az İlk Boyama (FP) süresi gösterir. Bu, State nesneleri oluşturma ve sürdürme yükünün olmamasıyla açıklanır.
Widget yalnızca üst öğeden alınan verileri görüntülüyorsa ve herhangi bir iç durumu yönetmiyorsa StatelessWidget kullanın. Widget'ın HTTP isteği yapması, kullanıcı girişini işlemesi veya bir akışa abone olması gerekiyorsa — StatefulWidget kullanın veya mantığı harici bir durum yönetimi katmanına (Bloc, Riverpod) taşıyın.
StatelessWidget optimizasyonu üç ilkeye dayanır: const kurucular, minimum widget ağacı ve anahtarların doğru kullanımı. Bir const kurucu, Flutter'ın widget'ı derleme zamanında bir kez oluşturmasına ve uygulamanın tüm ömrü boyunca yeniden kullanmasına olanak tanır. Bu, tekrarlanan build çağrıları ihtiyacını ortadan kaldırır ve bellek ayırıcı üzerindeki yükü azaltır.
Widget ağacını en aza indirmek ikinci önemli husustur. Her iç içe StatelessWidget, Öğe ağacına bir seviye ekler. Flutter her karede tüm ağacı dolaşmak zorundadır, bu nedenle ağaç ne kadar derinse, çerçeve için o kadar fazla iş demektir. Performanstan ödün vermeden okunabilirliği artırdığında basit widget'ları tek bir özel StatelessWidget'ta birleştirmeniz önerilir.
Anahtarlar (Key) üçüncü optimizasyon öğesidir. Bir listeyi yeniden oluştururken veya öğelerin sırasını değiştirirken, doğru bir anahtar Flutter'ın eski ve yeni öğeleri eşleştirmesine olanak tanıyarak widget'ların yeniden oluşturulmasını önler. StatelessWidget için, benzersiz veri tanımlayıcılarına dayalı ValueKey veya ObjectKey kullanmak yeterlidir.
StatelessWidget kurucusunda const kullanımı, widget listelerde veya tekrarlayan yapılarda tekrar tekrar kullanıldığında en büyük performans avantajını sağlar. Flutter yeni widget'ı mevcut Element ile karşılaştırır ve tür ve anahtar eşleşirse canUpdate öğesini çağırır. Aynı parametrelere sahip const widget'lar için Flutter, önbelleğe alınmış sonucu kullanarak build çağrısını tamamen atlar.
İlk yaygın hata, eşzamansız güncellemelerin gerekli olduğu yerlerde StatelessWidget kullanmaya çalışmaktır. Geliştiriciler bazen StatelessWidget kurucusuna bir HTTP isteği yerleştirir ve oluşturma sırasında verilerin yükleneceğini bekler. Pratikte, kurucu hafif olmalı ve yan etkileri olmamalıdır. Eşzamansız işlemler StatefulWidget.initState içinde veya harici hizmetlerde gerçekleştirilmelidir.
İkinci yaygın hata, build yöntemi içinde ağır hesaplamalar oluşturmaktır. Build sık sık çağrılabileceğinden (StatelessWidget için bile — üst öğe yeniden oluşturulduğunda), karmaşık hesaplamalar, önbelleğe alma olmadan MediaQuery.of(context) çağrıları veya build içinde yeni nesneler oluşturma performansı düşürür. Çözüm, hesaplamaları ezberleme (memoization) ile ayrı yöntemlere taşımak veya const fabrikaları kullanmaktır.
Üçüncü hata, olabilecek bir StatelessWidget'ta const kurucunun olmamasıdır. Bir widget const olarak bildirilmezse, parametreler değişmemiş olsa bile Flutter her üst build'inde yeni bir örnek oluşturur. Bu, aşırı bellek tüketimine ve çöp toplayıcının ekstra çalışmasına yol açar.
const olarak bildirinKey kullanınSıkça Sorulan Sorular
StatelessWidget oluşturulduktan sonra durumunu değiştiremez — yalnızca kurucu aracılığıyla iletilen verileri görüntüler. StatefulWidget, setState aracılığıyla değişebilen ayrı bir State nesnesi oluşturur, yaşam döngüsü yöntemlerine sahiptir ve eşzamansız UI güncellemelerine izin verir.
Evet, üst widget yeniden oluşturulursa ve yeni parametreler iletirse. StatelessWidget kendi kendine güncellenmez, ancak üst öğe tarafından yeni verilerle yeniden oluşturulabilir. Flutter, build'i tekrar çağırıp çağırmamaya karar vermek için runtimeType ve Key'i karşılaştırır.
const, Flutter'ın widget örneğini derleme zamanında oluşturmasına ve önbelleğe almasına olanak tanır. İki const widget aynı parametrelere sahipse, Flutter bir öğeyi yeniden kullanır ve build çağrısını tamamen atlar. Bu, listelerde ve tekrarlayan yapılarda performans artışı sağlar.
Parametreler değişmemiş olsa bile Flutter her üst build'inde yeni bir örnek oluşturur. Bu, bellek ayırıcı ve çöp toplayıcı üzerindeki yükü artırır ve alt widget'ların gereksiz yeniden oluşturulmasına neden olabilir.
Herhangi bir sınır yoktur. Tipik bir Flutter uygulamasında, StatelessWidget tüm widget'ların %50-80'ini oluşturur. Ne kadar çok StatelessWidget olursa, performans o kadar öngörülebilir ve mimari o kadar basit olur. Flutter, tek bir ağaçta binlerce StatelessWidget ile verimli çalışacak şekilde optimize edilmiştir.
Özet
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.
Ayrıca okuyun