Flutter: Align Widget ile İnce Hizalama İşlemleri
Align widget'ı, Center'ın daha gelişmiş versiyonu olarak düşünülebilir. İçinde bulunduğu alana göre çocuğunu istediğiniz konuma hassas bir şekilde yerleştirebilirsiniz.
Align Nedir?
Align, bir widget'ı parent'ı içinde belirli bir konuma hizalamak için kullanılır. Center sadece ortaya alırken, Align herhangi bir noktaya hizalama yapabilir.
Canlı Demo: Align Widget Örnekleri
Aşağıdaki interaktif örnekte farklı alignment değerlerini deneyebilirsiniz:
Temel Kullanım
Container(
width: 200,
height: 200,
color: Colors.blue.shade50,
child: Align(
alignment: Alignment.center,
child: Text('Ortada'),
),
)Alignment Değerleri
Flutter'da hazır tanımlı Alignment sabitleri:
Alignment.topLeft // Sol üst
Alignment.topCenter // Üst ortası
Alignment.topRight // Sağ üst
Alignment.centerLeft // Sol orta
Alignment.center // Tam ortası
Alignment.centerRight // Sağ orta
Alignment.bottomLeft // Sol alt
Alignment.bottomCenter // Alt ortası
Alignment.bottomRight // Sağ altÖrnekler
Sol Alt Köşeye Hizalama
Container(
width: 300,
height: 200,
color: Colors.grey.shade200,
child: Align(
alignment: Alignment.bottomLeft,
child: Container(
width: 50,
height: 50,
color: Colors.blue,
child: Center(child: Text('Alt Sol')),
),
),
)Container, parent'ının sol alt köşesine hizalanır.
Sağ Üst Köşeye Hizalama
Container(
width: 300,
height: 200,
color: Colors.grey.shade200,
child: Align(
alignment: Alignment.topRight,
child: Icon(Icons.close, color: Colors.red),
),
)Özel Alignment Değerleri
Alignment, -1.0 ile 1.0 arasında x ve y koordinatları kullanır:
Align(
alignment: Alignment(0.0, 0.0), // Tam ortası (Alignment.center ile aynı)
child: Text('Merkez'),
)
Align(
alignment: Alignment(-1.0, -1.0), // Sol üst (Alignment.topLeft ile aynı)
child: Text('Sol Üst'),
)
Align(
alignment: Alignment(1.0, 1.0), // Sağ alt (Alignment.bottomRight ile aynı)
child: Text('Sağ Alt'),
)Koordinat Sistemi
- x ekseni: -1.0 (sol) → 0.0 (ortası) → 1.0 (sağ)
- y ekseni: -1.0 (üst) → 0.0 (ortası) → 1.0 (alt)
Özel Konumlar
// Sağa yakın, ortada
Align(
alignment: Alignment(0.5, 0.0),
child: Text('Sağa kayık'),
)
// Sol üst köşeye yakın, tam köşede değil
Align(
alignment: Alignment(-0.7, -0.7),
child: Text('Sol üste yakın'),
)
// Alt kenara yakın, yatayda ortada
Align(
alignment: Alignment(0.0, 0.8),
child: Text('Alta yakın'),
)FractionalOffset (Alternatif)
FractionalOffset kullanarak 0.0 ile 1.0 arasında oransal konumlandırma yapabilirsiniz:
Align(
alignment: FractionalOffset(0.0, 0.0), // Sol üst
child: Text('Sol Üst'),
)
Align(
alignment: FractionalOffset(0.5, 0.5), // Tam ortası
child: Text('Ortası'),
)
Align(
alignment: FractionalOffset(1.0, 1.0), // Sağ alt
child: Text('Sağ Alt'),
)Fark: FractionalOffset'te (0, 0) sol üsttir, (1, 1) sağ alttır. Alignment'te ise (-1, -1) sol üst, (1, 1) sağ alttır.
Pratik Kullanım Örnekleri
Örnek 1: Rozet (Badge) Oluşturma
Stack(
children: [
Icon(Icons.notifications, size: 32),
Align(
alignment: Alignment.topRight,
child: Container(
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
child: Text('3', style: TextStyle(color: Colors.white, fontSize: 10)),
),
),
],
)Örnek 2: Floating Action Button Benzeri
Container(
width: 300,
height: 400,
color: Colors.grey.shade100,
child: Align(
alignment: Alignment.bottomRight,
child: Padding(
padding: EdgeInsets.all(16),
child: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
),
),
),
)Örnek 3: Kapat Butonu
Container(
width: 300,
height: 200,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
),
child: Stack(
children: [
Padding(
padding: EdgeInsets.all(16),
child: Text('İçerik'),
),
Align(
alignment: Alignment.topRight,
child: IconButton(
icon: Icon(Icons.close),
onPressed: () {},
),
),
],
),
)Örnek 4: Alt Bilgi Çubuğu
Container(
width: 300,
height: 400,
child: Align(
alignment: Alignment.bottomCenter,
child: Container(
width: double.infinity,
padding: EdgeInsets.all(16),
color: Colors.blue,
child: Text(
'Alt Bilgi',
style: TextStyle(color: Colors.white),
textAlign: TextAlign.center,
),
),
),
)Align vs Center vs mainAxisAlignment
Center
Center(child: Text('Ortası'))
// Her zaman tam ortalar, başka seçenek yokAlign
Align(
alignment: Alignment.topRight,
child: Text('Sağ üst'),
)
// Herhangi bir noktaya hizalayabilirmainAxisAlignment (Row/Column)
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [Text('Ortası')],
)
// Sadece ana eksen boyunca hizalar
// Birden fazla child ile çalışırwidthFactor ve heightFactor
Align'ın boyutunu child'a göre ayarlayabilirsiniz:
Align(
alignment: Alignment.topLeft,
widthFactor: 2.0, // Child genişliğinin 2 katı
heightFactor: 1.5, // Child yüksekliğinin 1.5 katı
child: Container(
width: 50,
height: 50,
color: Colors.blue,
),
)Bu durumda Align widget'ı 100x75 piksel boyutunda olur (50x2, 50x1.5).
Responsive Hizalama
LayoutBuilder(
builder: (context, constraints) {
// Küçük ekranlarda alt ortada, büyük ekranlarda sağ altta
final alignment = constraints.maxWidth < 600
? Alignment.bottomCenter
: Alignment.bottomRight;
return Align(
alignment: alignment,
child: ElevatedButton(
onPressed: () {},
child: Text('Dinamik Konum'),
),
);
},
)Ne Zaman Kullanmalı?
Align kullanın:
- Belirli bir köşeye veya kenara hizalama gerektiğinde
- Özel konumlandırma yapmak istediğinizde
- Stack içinde konum belirlerken
- Center'dan daha fazla kontrol gerektiğinde
Center kullanın:
- Sadece ortalama gerektiğinde
- Basit ve hızlı çözüm yeterli olduğunda
mainAxisAlignment/crossAxisAlignment kullanın:
- Birden fazla widget hizalarken
- Row veya Column içinde çalışırken
Özet
Align widget'ı:
- İçinde bulunduğu alana göre child'ı hizalar
- Center'ın gelişmiş versiyonudur
- -1.0 ile 1.0 arası koordinat sistemi kullanır
- Önceden tanımlı 9 standart konum vardır
- Özel konumlar için Alignment(x, y) kullanılır
- Stack ile birlikte çok kullanışlıdır
Align, hassas konumlandırma gereken durumlarda vazgeçilmez bir araçtır.