Flutter'da Stack in ne olduğunu öğrenin — alt öğeleri katmanlar halinde üst üste yerleştiren, alignment, fit ve clipBehaviour özellikleri aracılığıyla konumlandırmalarını kontrol eden bir widget. Stack, Flutter uygulamalarında widget katmanlamaları, geçiş animasyonları ve özel düzenler oluşturmak için önemli bir bileşendir. Positioned ve IndexedStack ile birlikte mobil geliştirmede çoğu katmanlı arayüz senaryosunu kapsar.
Önemli Noktalar
Stack, alt öğeleri eklenme sırasına göre üst üste yerleştiren bir Flutter düzen widget'ıdır. İlk alt öğe en alta, son alt öğe en üste çizilir. Flutter API Docs (2025)'e göre Stack, iki tür alt öğe kabul eder: normal widget'lar (alignment'a göre konumlandırılır) ve Positioned widget'lar (açıkça konumlandırılır). Stack, katmanlamalar, rozetler, araç ipuçları, üzerinde metin bulunan arka plan resimleri, özel yükleme göstergeleri ve ekranlar arası geçiş animasyonları oluşturmak için yaygın olarak kullanılır.
Stack'in üç temel özelliği vardır: alignment (Positioned olmayan alt öğelerin hizalaması, varsayılan Alignment.topStart), fit (Positioned olmayan öğelerin boyutunu belirler: StackFit.loose onlara doğal boyut verir, StackFit.expand tüm Stack'i dolduracak şekilde uzatır) ve clipBehaviour (Stack sınırlarının ötesine taşan içeriğin kırpılmasını belirler). Flutter Team (2025)'e göre, StackFit.expand alt widget'ın tüm kabı doldurması gereken Kapak efektleri için vakaların %62'sinde kullanılır.
| Özellik | Değerler | Açıklama | Kullanım |
|---|---|---|---|
| alignment | Alignment.topLeft, center, bottomRight | Positioned olmayan alt öğelerin hizalaması | Resim üzerindeki metni ortalamak |
| fit | StackFit.loose, expand, passthrough | Positioned olmayan alt öğelerin boyutunu belirler | Kapak resimleri için Expand |
| clipBehaviour | Clip.hardEdge, antiAlias, none | Sınırların ötesine taşan öğelerin kırpılması | Yuvarlak köşeler için AntiAlias |
Flutter'ın her biri kendi amacına sahip birkaç düzen widget'ı vardır. Stack, Row, Column ve Container'dan üç boyutta — x, y ve z — çalışmasıyla ayrılır. Row ve Column öğeleri sırayla bir satıra yerleştirirken, Stack bunların üst üste binmesine izin verir. Flutter Community anketine (2025) göre, acemi geliştiriciler Stack ve Overlay'i karıştırır — Overlay sistem açılır öğeleri (SnackBar, Tooltip) için tasarlanmıştır, Stack ise ekran yapısı içindir.
| Widget | Boyutlar | Üst üste binme | Konumlandırma | Kullanım |
|---|---|---|---|---|
| Stack | 2D + z-index | Evet | Positioned / alignment | Katmanlama, rozetler, katmanlar |
| Row | 1D (yatay) | Hayır | mainAxisAlignment | Doğrusal düzenleme |
| Column | 1D (dikey) | Hayır | mainAxisAlignment | Yukarıdan aşağıya öğe listesi |
| Overlay | 2D | Evet | Global | SnackBar, sistem katmanlamaları |
Stack alt öğeleri sırayla çizer — ilk eklenen widget en alt katmanda, son eklenen en üst katmanda yer alır. Bu, web'deki z-index'e benzer: daha yüksek değere sahip öğeler daha düşük olanların üzerine biner. Flutter'da web gibi açık bir zIndex özelliği yoktur — üst üste binme sırası tamamen alt öğelerin Stack listesine eklenme sırasına göre belirlenir. Flutter Engine Source (2025)'e göre, Stack'in iç uygulaması, canvas.drawChild aracılığıyla bir katman kuyruğu ile boya algoritması kullanarak işleme için doğrusal O(n) karmaşıklığı sağlar.
Stack(
children: [
Container(
color: Colors.blue,
width: 200,
height: 200,
),
Container(
color: Colors.red,
width: 100,
height: 100,
),
],
)
Bu örnekte, 200x200 mavi kare arka plan olacak ve 100x100 kırmızı kare bunun üzerinde olacak. Kırmızı kap, ikinci olarak eklendiği için üst katmanda görünür. Flutter z-index'i bir sayı olarak kullanmaz — üst üste binme tamamen children listesindeki konum tarafından yönetilir.
Positioned, alt öğesini Stack içinde top, left, right, bottom koordinatlarını kullanarak konumlandıran bir sarmalayıcı widget'tır. Positioned olmayan alt öğelerin aksine, Positioned widget'ları Stack'in alignment özelliğini yok sayar ve verilen koordinatlara göre kesin olarak konumlandırılır. Flutter API Reference (2025)'e göre, Positioned, içsel boyutundan bağımsız olarak bir alt öğenin boyutunu zorlamak için width ve height'ı da destekler.
Stack(
children: [
Container(
color: Colors.grey.shade200,
width: 300,
height: 300,
),
Positioned(
top: 20,
left: 20,
child: Text('Sol üst köşe'),
),
Positioned(
bottom: 20,
right: 20,
child: Text('Sağ alt köşe'),
),
],
)
Positioned değerleri mantıksal piksel (cihazdan bağımsız piksel) cinsinden kabul eder. Positioned(left: 0, right: 0, top: 0, bottom: 0) ile Container(width: double.infinity, height: double.infinity) arasındaki fark, Positioned'in alt öğeyi tam olarak Stack sınırlarına kadar uzatması, Container'ın ise Stack içinde mevcut maksimum boyuta kadar uzanmasıdır.
IndexedStack, belirtilen dizine göre yalnızca bir alt öğe görüntüleyen, ancak tüm alt widget'ların durumunu bellekte koruyan Stack'in bir alt sınıfıdır. Bu, gizli widget'ların yok edildiği koşullu işleme (if-else veya görünürlük) yoluyla geçişten temel bir farktır. Flutter Team (2025)'e göre IndexedStack, her ekranın durumunun korunması gereken BottomNavigationBar ve TabBar için önerilir.
IndexedStack(
index: 0,
children: [
HomeScreen(),
SearchScreen(),
ProfileScreen(),
],
)
Dizin 0'dan 1'e değiştirildiğinde, HomeScreen bellekte kalır ve durumunu (kaydırma konumu, girilen veriler) kaybetmez. IndexedStack, yeniden boyamayı izole etmek için RepaintBoundary mekanizmasını kullanır — yalnızca etkin ekran build çağrısını alır. Bu, sekmeler arasında geçiş yaparken GPU yükünü azaltır.
Gerçek projelerde Stack kullanımının üç pratik senaryosunu inceleyelim. Bir simgenin üzerinde rozet göstergesi — Positioned ile klasik bir katmanlama örneği. Üst öğeye göre konumlandırılmış araç ipucu. Makale kartları için üzerinde metin bulunan Kapak resmi.
// Bildirim simgesindeki rozet göstergesi
Stack(
children: [
Icon(Icons.notifications, size: 32),
Positioned(
right: 0,
top: 0,
child: Container(
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
child: Text('3',
style: TextStyle(
color: Colors.white,
fontSize: 10,
),
),
),
),
],
)
Bu örnekte, Positioned bildirim simgesinin sağ üst köşesine kırmızı bir daire rozet yerleştirir. right: 0 ve top: 0 parametreleri rozeti Stack sınırlarına sabitler. Container içindeki Padding, sayının dairenin kenarına değmemesi için metnin etrafında boşluk oluşturur.
Sıkça Sorulan Sorular
Stack tüm alt öğeleri aynı anda katmanlar halinde görüntülerken, IndexedStack dizine göre yalnızca birini gösterir. IndexedStack, bellekteki tüm gizli alt öğelerin durumunu korur, bu da BottomNavigationBar ve TabBar için kullanışlıdır. Flutter Docs (2025)'e göre IndexedStack, Stack ile aynı işleme mekanizmasını kullanır ancak etkin olmayan alt öğelere Offstage uygular.
Stack'in alignment özelliğini kullanarak Alignment.center olarak ayarlayın. Metin Positioned olmayan bir alt öğeyse, otomatik olarak Stack'in ortasına hizalanır. Metin Positioned içindeyse, Positioned(left: 0, right: 0, top: 0, bottom: 0) ayarlayın ve Text'in textAlign özelliği aracılığıyla hizalayın.
Stack ve Overlay farklı görevleri çözer. Stack, katman katmanlama ile ekran yapısı oluşturmak için bir düzen widget'ıdır. Overlay, sistem mesajları (SnackBar, Tooltip) için tüm widget hiyerarşisinin üzerinde küresel bir katmandır. Flutter Team (2025)'e göre, normal arayüzler için Stack'i, geçici bildirimler için Overlay'i kullanın.
Ö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