İçeriğe geç / Skip to content
Ahmet Balaman LogoAhmet Balaman

Flutter: SizedBox ile Boyutlandırma ve Boşluk

Ahmet Balaman
FlutterSizedBoxLayoutSpacingWidget

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:

  1. Widget'lara sabit boyut vermek
  2. 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) veya SizedBox(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.

Yorumlar