Flutter: Padding ile İç Boşluk Yönetimi
Padding, widget'ların etrafında iç boşluk (padding) oluşturmak için kullanılan temel bir widget'tır. Tasarım dünyasından aşinaysanız, padding kavramını biliyorsunuzdur.
Padding Nedir?
Padding, bir widget'ın içeriği ile dış sınırı arasında boşluk bırakır. Margin'in tersine, padding widget'ın içinde boşluk oluşturur.
Temel Kullanım
Padding(
padding: EdgeInsets.all(16),
child: Text('Etrafımda 16 piksel boşluk var'),
)EdgeInsets Türleri
Flutter'da padding değerleri EdgeInsets sınıfı ile belirlenir.
EdgeInsets.all()
Tüm kenarlardan eşit boşluk:
Padding(
padding: EdgeInsets.all(16),
child: Text('Her yönden 16 piksel'),
)EdgeInsets.symmetric()
Yatay ve dikey eksenlerde simetrik boşluk:
Padding(
padding: EdgeInsets.symmetric(
horizontal: 16, // Sol ve sağdan 16 piksel
vertical: 8, // Üst ve alttan 8 piksel
),
child: Text('Simetrik boşluk'),
)EdgeInsets.only()
Belirli kenarlardan boşluk:
Padding(
padding: EdgeInsets.only(
left: 16,
top: 8,
right: 16,
bottom: 8,
),
child: Text('Özel boşluk'),
)İstediğiniz kenarları belirtebilirsiniz:
// Sadece sol ve üstten
Padding(
padding: EdgeInsets.only(left: 16, top: 8),
child: Text('Sol ve üstten boşluk'),
)EdgeInsets.fromLTRB()
Sol, üst, sağ, alt sırasıyla:
Padding(
padding: EdgeInsets.fromLTRB(16, 8, 16, 12),
// Left: 16, Top: 8, Right: 16, Bottom: 12
child: Text('LTRB formatında'),
)EdgeInsets.zero
Hiç boşluk yok (varsayılan):
Padding(
padding: EdgeInsets.zero,
child: Text('Boşluk yok'),
)Pratik Kullanım Örnekleri
Örnek 1: 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('İçerik metni buraya gelir...'),
],
),
),
)Örnek 2: Liste Öğesi
Container(
decoration: BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.grey.shade300)),
),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row(
children: [
Icon(Icons.person),
SizedBox(width: 12),
Expanded(child: Text('Kullanıcı Adı')),
Icon(Icons.arrow_forward_ios, size: 16),
],
),
),
)Örnek 3: Buton İç Boşluğu
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(horizontal: 32, vertical: 16),
),
child: Text('Geniş Buton'),
)Örnek 4: Sayfa İçeriği
Scaffold(
appBar: AppBar(title: Text('Sayfa')),
body: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Başlık', style: TextStyle(fontSize: 24)),
SizedBox(height: 8),
Text('İçerik buraya gelir...'),
],
),
),
)İç İçe Padding
Padding'leri iç içe kullanabilirsiniz:
Container(
color: Colors.blue.shade100,
child: Padding(
padding: EdgeInsets.all(20),
child: Container(
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(16),
child: Text('İç içe padding'),
),
),
),
)Dış padding 20, iç padding 16 piksel olur.
Container Padding vs Padding Widget
Container'ın padding özelliği ile Padding widget'ı aynı sonucu verir:
Container ile
Container(
padding: EdgeInsets.all(16),
color: Colors.blue,
child: Text('Container padding'),
)Padding Widget ile
Container(
color: Colors.blue,
child: Padding(
padding: EdgeInsets.all(16),
child: Text('Padding widget'),
),
)Hangisi?
- Zaten Container kullanıyorsanız:
paddingözelliği - Sadece padding gerekiyorsa:
Paddingwidget - Performans farkı yok, tercihe bağlı
Responsive Padding
Ekran boyutuna göre dinamik padding:
LayoutBuilder(
builder: (context, constraints) {
final isSmallScreen = constraints.maxWidth < 600;
return Padding(
padding: EdgeInsets.all(isSmallScreen ? 8 : 24),
child: Text('Responsive padding'),
);
},
)veya MediaQuery ile:
Builder(
builder: (context) {
final screenWidth = MediaQuery.of(context).size.width;
final padding = screenWidth * 0.05; // Ekranın %5'i
return Padding(
padding: EdgeInsets.all(padding),
child: Text('Oransal padding'),
);
},
)Standart Padding Değerleri
Material Design önerileri:
EdgeInsets.all(4) // Çok dar
EdgeInsets.all(8) // Dar
EdgeInsets.all(12) // Orta-dar
EdgeInsets.all(16) // Standart (en yaygın)
EdgeInsets.all(24) // Geniş
EdgeInsets.all(32) // Çok genişYatay ve dikey için:
EdgeInsets.symmetric(horizontal: 16, vertical: 8) // Liste öğeleri
EdgeInsets.symmetric(horizontal: 24, vertical: 16) // Kartlar
EdgeInsets.symmetric(horizontal: 16, vertical: 12) // ButonlarPadding vs Margin
Padding (İç Boşluk)
Container(
color: Colors.blue,
child: Padding(
padding: EdgeInsets.all(16),
child: Text('Mavi arka planlı metin'),
),
)Mavi arka plan, text'in etrafında 16 piksel içerde kalır.
Margin (Dış Boşluk)
Container(
margin: EdgeInsets.all(16),
color: Colors.blue,
child: Text('Mavi arka planlı metin'),
)Mavi arka plan, dış boşluktan sonra başlar.
Görsel Fark:
- Padding: Arka plan rengini etkiler, içeride boşluk
- Margin: Arka plan rengini etkilemez, dışarıda boşluk
Safe Area ile Birlikte Kullanım
Ekran kenarlarından güvenli mesafe için SafeArea ile birlikte:
Scaffold(
body: SafeArea(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
children: [
Text('Güvenli alanda'),
Text('içerik'),
],
),
),
),
)ListView ile Padding
ListView'da padding iki şekilde kullanılabilir:
ListView padding Özelliği
ListView(
padding: EdgeInsets.all(16),
children: [
Text('Öğe 1'),
Text('Öğe 2'),
Text('Öğe 3'),
],
)Her Öğeye Ayrı Padding
ListView(
children: [
Padding(
padding: EdgeInsets.all(8),
child: Text('Öğe 1'),
),
Padding(
padding: EdgeInsets.all(8),
child: Text('Öğe 2'),
),
],
)Negatif Padding?
EdgeInsets negatif değer alamaz. Negatif boşluk için Transform veya OverflowBox kullanın:
Transform.translate(
offset: Offset(-10, -10), // Negatif kaydırma
child: Text('Kaydırılmış'),
)Directionality ile Padding
RTL (sağdan sola) dillerde left/right yerine start/end kullanın:
// LTR ve RTL için uygun
Padding(
padding: EdgeInsetsDirectional.only(
start: 16, // LTR'de sol, RTL'de sağ
end: 8, // LTR'de sağ, RTL'de sol
),
child: Text('Yönden bağımsız'),
)Performans İpuçları
- Const kullanın: EdgeInsets değerleri değişmiyorsa const yapın:
Padding(
padding: const EdgeInsets.all(16), // const
child: Text('Performanslı'),
)Gereksiz padding'den kaçının: Çok fazla iç içe padding widget'ı performansı düşürebilir.
Container padding'i tercih edin: Zaten Container kullanıyorsanız, ayrı Padding widget'ı eklemeyin.
Özet
Padding:
- Widget'ların içinde boşluk oluşturur
EdgeInsetsile değerler belirlenirall(),symmetric(),only(),fromLTRB()metotları vardır- Margin'in tersine içerde boşluk yaratır
- Container'ın padding özelliği ile aynı işi yapar
- Responsive ve standart değerler kullanılmalıdır
En Yaygın Kullanımlar:
EdgeInsets.all(16): Genel amaçlıEdgeInsets.symmetric(horizontal: 16, vertical: 8): Liste öğeleriEdgeInsets.only(...): Özel durumlar
Padding, her Flutter uygulamasında en çok kullanılan widget'lardan biridir ve iyi tasarımın temelidir.