Flutter: SizedBox ile Boyutlandırma ve Boşluk
SizedBox, Flutter'da widget'lara sabit boyut vermek veya widget'lar arasında boşluk oluşturmak için kullanılan basit ama çok işlevsel bir widget'tır.
SizedBox Nedir?
SizedBox, sabit genişlik ve/veya yükseklik belirleyebileceğiniz bir kutu oluşturur. İki ana kullanım amacı vardır:
- Widget'lara sabit boyut vermek
- Widget'lar arasında boşluk oluşturmak
Temel Kullanım
Sabit Boyut Verme
SizedBox(
width: 200,
height: 100,
child: Container(
color: Colors.blue,
child: Center(child: Text('200x100 kutu')),
),
)Container'ı SizedBox içine alarak boyutunu sınırlamış olduk.
Sadece Genişlik Belirleme
SizedBox(
width: 150,
child: ElevatedButton(
onPressed: () {},
child: Text('Sabit genişlikte buton'),
),
)Sadece Yükseklik Belirleme
SizedBox(
height: 80,
child: Image.network('https://example.com/logo.png'),
)Boşluk Oluşturma
SizedBox'un en yaygın kullanımlarından biri, widget'lar arasında görünmeyen boşluk oluşturmaktır.
Dikey Boşluk (Column içinde)
Column(
children: [
Text('Birinci metin'),
SizedBox(height: 16), // 16 piksel dikey boşluk
Text('İkinci metin'),
SizedBox(height: 24), // 24 piksel dikey boşluk
ElevatedButton(
onPressed: () {},
child: Text('Buton'),
),
],
)Yatay Boşluk (Row içinde)
Row(
children: [
Icon(Icons.star),
SizedBox(width: 8), // 8 piksel yatay boşluk
Text('Yıldızlı'),
SizedBox(width: 16), // 16 piksel yatay boşluk
Icon(Icons.favorite),
],
)Container Yeniden Boyutlandırma
Mevcut bir Container'ı yeniden boyutlandırmak için SizedBox kullanabilirsiniz:
// Orijinal Container
Container(
width: 300,
height: 200,
color: Colors.blue,
child: Center(child: Text('Büyük kutu')),
)
// SizedBox ile yeniden boyutlandırılmış
SizedBox(
width: 150,
height: 100,
child: Container(
color: Colors.blue,
child: Center(child: Text('Küçük kutu')),
),
)Container SizedBox tarafından belirlenen boyutlara sınırlanır.
SizedBox.shrink()
İçeriği olmayan, sıfır boyutunda bir widget oluşturur. Koşullu durumlarda hiçbir şey göstermemek için kullanışlıdır:
Column(
children: [
Text('Her zaman görünür'),
condition ? Text('Koşullu görünür') : SizedBox.shrink(),
Text('Her zaman görünür'),
],
)SizedBox.expand()
Mevcut tüm alanı kaplayacak şekilde genişler:
SizedBox.expand(
child: Container(
color: Colors.blue,
child: Center(child: Text('Tüm alan')),
),
)Parent'ın tüm genişlik ve yüksekliğini kaplar.
SizedBox.square()
Kare şeklinde (eşit genişlik ve yükseklik) bir alan oluşturur:
SizedBox.square(
dimension: 100,
child: Container(
color: Colors.red,
child: Center(child: Text('Kare')),
),
)100x100 piksel kare alan oluşturur.
Pratik Kullanım Örnekleri
Örnek 1: Form Düzeni
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text('Kullanıcı Adı', style: TextStyle(fontWeight: FontWeight.bold)),
SizedBox(height: 8),
TextField(
decoration: InputDecoration(border: OutlineInputBorder()),
),
SizedBox(height: 16),
Text('Şifre', style: TextStyle(fontWeight: FontWeight.bold)),
SizedBox(height: 8),
TextField(
obscureText: true,
decoration: InputDecoration(border: OutlineInputBorder()),
),
SizedBox(height: 24),
ElevatedButton(
onPressed: () {},
child: Text('Giriş Yap'),
),
],
)Örnek 2: Kart Düzeni
Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Başlık', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
SizedBox(height: 8),
Text('Alt başlık', style: TextStyle(color: Colors.grey)),
SizedBox(height: 16),
Text('İçerik metni burada yer alır...'),
SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(onPressed: () {}, child: Text('İPTAL')),
SizedBox(width: 8),
ElevatedButton(onPressed: () {}, child: Text('TAMAM')),
],
),
],
),
),
)Örnek 3: Icon ve Text Kombinasyonu
Row(
children: [
SizedBox(
width: 40,
height: 40,
child: Icon(Icons.notifications, color: Colors.blue),
),
SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Bildirim', style: TextStyle(fontWeight: FontWeight.bold)),
SizedBox(height: 4),
Text('Yeni mesajınız var', style: TextStyle(fontSize: 12)),
],
),
),
],
)Örnek 4: Sabit Boyutlu Butonlar
Column(
children: [
SizedBox(
width: double.infinity,
height: 48,
child: ElevatedButton(
onPressed: () {},
child: Text('Tam genişlik buton'),
),
),
SizedBox(height: 12),
SizedBox(
width: 200,
height: 48,
child: OutlinedButton(
onPressed: () {},
child: Text('Sabit genişlik buton'),
),
),
],
)SizedBox vs Container
Container da boyut belirleyebilir, peki fark nedir?
Container
Container(
width: 100,
height: 100,
color: Colors.blue,
padding: EdgeInsets.all(8),
margin: EdgeInsets.all(8),
child: Text('Container'),
)- Padding, margin, color, decoration gibi özellikleri var
- Daha fazla özellik = daha fazla işlem yükü
SizedBox
SizedBox(
width: 100,
height: 100,
child: Text('SizedBox'),
)- Sadece boyut belirleme yapar
- Daha hafif ve performanslı
- Sadece boyut gerektiğinde tercih edilmeli
Kural: Sadece boyut belirleyecekseniz SizedBox, renk/padding/decoration gerekiyorsa Container kullanın.
Boşluk için SizedBox vs Padding
SizedBox (Boşluk için)
Column(
children: [
Text('Üst'),
SizedBox(height: 16),
Text('Alt'),
],
)- Widget'lar arası boşluk
- Görünmez ayraç
- Daha okunabilir kod
Padding (İç boşluk için)
Padding(
padding: EdgeInsets.all(16),
child: Text('Etrafında boşluk'),
)- Widget'ın etrafında boşluk
- İç boşluk (padding)
Responsive Boyutlandırma
MediaQuery ile dinamik boyutlar:
LayoutBuilder(
builder: (context, constraints) {
return SizedBox(
width: constraints.maxWidth * 0.8, // Ekranın %80'i
height: constraints.maxHeight * 0.5, // Ekranın %50'si
child: Container(
color: Colors.blue,
child: Center(child: Text('Responsive boyut')),
),
);
},
)Standart Boşluk Değerleri
Material Design'a göre önerilen boşluk değerleri:
SizedBox(height: 4) // Çok küçük boşluk
SizedBox(height: 8) // Küçük boşluk
SizedBox(height: 12) // Orta-küçük boşluk
SizedBox(height: 16) // Orta boşluk
SizedBox(height: 24) // Büyük boşluk
SizedBox(height: 32) // Çok büyük boşluk
SizedBox(height: 48) // Bölüm arası boşlukÖzet
SizedBox:
- Sabit boyut belirleme için kullanılır
- Widget'lar arası görünmez boşluk oluşturur
- Container'dan daha hafif ve performanslıdır
shrink(),expand(),square()factory constructor'ları vardır- Boşluk için en yaygın kullanılan widget'tır
Kullanım önerileri:
- Boşluk için:
SizedBox(height: x)veyaSizedBox(width: x) - Sabit boyut için:
SizedBox(width: x, height: y) - Hiçbir şey göstermemek için:
SizedBox.shrink() - Kare alan için:
SizedBox.square(dimension: x)
SizedBox, Flutter'da layout oluştururken en çok kullanacağınız widget'lardan biridir.