↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 2 — Konu 7: Temel Layout — Container, Row, Column, Stack, Padding, Align, Center

4 dk okuma #flutter
Dizi · 7/61 Flutter Türkçe Tutorial
  1. Bölüm 1 — Konu 1: Flutter Nedir, Mimarisi (Widget → Element → RenderObject, Skia/Impeller)
  2. Bölüm 1 — Konu 2: Ortam Kurulumu (Flutter SDK, Android Studio/VS Code, Emulator/Simulator, DevTools'a İlk Bakış)
  3. Bölüm 1 — Konu 3: İlk Proje Yapısı (`pubspec.yaml`, `lib/`, Klasör Mimarisi, `flutter create` Anatomisi)
  4. Bölüm 1 — Konu 4: Hot Reload / Hot Restart Ne Yapıyor, Neden Önemli
  5. Bölüm 2 — Konu 5: "Her Şey Widget'tır" Felsefesi, Widget Ağacı
  6. Bölüm 2 — Konu 6: StatelessWidget vs StatefulWidget + `setState()` Derinlemesine (Rebuild Mekanizması)
  7. Bölüm 2 — Konu 7: Temel Layout — Container, Row, Column, Stack, Padding, Align, Center
  8. Bölüm 2 — Konu 8: Constraint Sistemi — "Constraints Go Down, Sizes Go Up, Parent Sets Position"
  9. Bölüm 2 — Konu 9: `Expanded`, `Flexible`, `Spacer`, Intrinsic Widget'lar
  10. Bölüm 3 — Konu 10: MaterialApp/CupertinoApp, Scaffold, AppBar
  11. Bölüm 3 — Konu 11: `ListView`, `GridView`, `SingleChildScrollView` (+ Builder Pattern)
  12. Bölüm 3 — Konu 12: Text, TextStyle, Icon, Image, Asset Yönetimi
  13. Bölüm 3 — Konu 13: Custom Widget Yazma Prensipleri (Composition Over Inheritance)
  14. Bölüm 3 — Konu 14: Navigator 1.0 — Push/Pop, Named Routes
  15. Bölüm 4 — Konu 15: Form, TextField/TextFormField, GlobalKey<FormState>, Validasyon
  16. Bölüm 4 — Konu 16: Theme Sistemi (ThemeData, ColorScheme)
  17. Bölüm 4 — Konu 17: Responsive & Adaptive Tasarım (MediaQuery, LayoutBuilder, OrientationBuilder, Breakpoint Stratejileri)
  18. Bölüm 5 — Konu 18: Future/Async-Await Flutter Bağlamında, FutureBuilder
  19. Bölüm 5 — Konu 19: `Stream`, `StreamBuilder`
  20. Bölüm 5 — Konu 20: HTTP İstekleri (`http` / `dio` Paketleri)
  21. Bölüm 5 — Konu 21: JSON Serialization (Manuel → `json_serializable`/`freezed`)
  22. Bölüm 5 — Konu 22: Local Storage — `shared_preferences` → `Hive` → `sqflite`/Drift
  23. Bölüm 6 — Konu 23: InheritedWidget ve InheritedModel — "Neden setState Yetmiyor" Sorusunun Cevabı
  24. Bölüm 6 — Konu 24: Provider Paketi
  25. Bölüm 6 — Konu 25: Riverpod (Modern Yaklaşım, Provider'ın Halefi)
  26. Bölüm 6 — Konu 26: BLoC/Cubit Pattern (`flutter_bloc`)
  27. Bölüm 6 — Konu 27: GetX (Tartışmalı Ama Yaygın)
  28. Bölüm 6 — Konu 28: Karşılaştırma — Hangi Projede Hangisi?
  29. Bölüm 7 — Konu 29: Navigator 2.0 (Router, RouteInformationParser, RouterDelegate)
  30. Bölüm 7 — Konu 30: `go_router` Paketi (Pratik ve Modern Çözüm)
  31. Bölüm 7 — Konu 31: Deep Linking
  32. Bölüm 7 — Konu 32: Repository Pattern, Katmanlı Mimari (Data/Domain/Presentation)
  33. Bölüm 7 — Konu 33: Dependency Injection (`get_it`, `injectable`)
  34. Bölüm 7 — Konu 34: Clean Architecture Uyarlaması, SOLID Prensipleri
  35. Bölüm 8 — Konu 35: Implicit Animasyonlar
  36. Bölüm 8 — Konu 36: Explicit Animasyonlar (`AnimationController`, `Tween`, `Curve`)
  37. Bölüm 8 — Konu 37: Hero Animasyonları
  38. Bölüm 8 — Konu 38: `CustomPainter` / `Canvas`
  39. Bölüm 8 — Konu 39: Rive / Lottie Entegrasyonu
  40. Bölüm 9 — Konu 40: Platform Channels
  41. Bölüm 9 — Konu 41: Permission Yönetimi (`permission_handler`)
  42. Bölüm 9 — Konu 42: Kamera, Konum, Sensörler
  43. Bölüm 9 — Konu 43: Push Notification (Firebase Cloud Messaging)
  44. Bölüm 9 — Konu 44: Android/iOS Build Sistemleri
  45. Bölüm 10 — Konu 45: Test Yazımı (Unit, Widget, Integration, Golden)
  46. Bölüm 10 — Konu 46: CI/CD
  47. Bölüm 10 — Konu 47: Rebuild Optimizasyonu (`const`, `key` Kullanımı)
  48. Bölüm 10 — Konu 48: DevTools Profiling
  49. Bölüm 10 — Konu 49: Lazy Loading, Pagination, Büyük Liste Performansı
  50. Bölüm 11 — Konu 50: Firebase Ekosistemi (Auth, Firestore, Storage, Functions)
  51. Bölüm 11 — Konu 51: Supabase Alternatifi
  52. Bölüm 11 — Konu 52: GraphQL (Opsiyonel)
  53. Bölüm 11 — Konu 53: Store Yayınlama Süreci (İmzalama, Listing, Versiyonlama)
  54. Bölüm 11 — Konu 54: App Size, Obfuscation, Flavor Yönetimi
  55. Bölüm 12 — Konu 55: Flutter Web / Desktop
  56. Bölüm 12 — Konu 56: Custom `RenderObject` Yazımı
  57. Bölüm 12 — Konu 57: Engine Mimarisi Derinlemesine (Impeller vs Skia)
  58. Bölüm 12 — Konu 58: Plugin Geliştirme, pub.dev'e Paket Yayınlama
  59. Bölüm 12 — Konu 59: Monorepo Mimarisi (Melos)
  60. Bölüm 12 — Konu 60: Erişilebilirlik (Accessibility) Derinlemesine
  61. Bölüm 12 — Konu 61: Yerelleştirme (Localization / i18n)
Dizinin sayfası →
İçindekiler 10 başlık
  1. Container — "İsviçre Çakısı" Widget
  2. Row ve Column — Yatay ve Dikey Dizilim
  3. Stack — Üst Üste Bindirme
  4. Padding — Sadece Boşluk
  5. Align — Belirli Bir Konuma Hizalama
  6. Center — Align'ın Özel Bir Hali
  7. Bunları Bir Arada Kullanmak
  8. 🎯 Bu Dersten Çıkarılması Gerekenler
  9. 📝 Ödevler
  10. 🎮 Mini Uygulama — Basit Bir Kartvizit Ekranı

Bu derste, Flutter'da arayüz kurmanın temel yapı taşlarını öğreneceğiz. Bölüm 2 Konu 5'te öğrendiğin child/children kavramları burada somutlaşacak.

Container — "İsviçre Çakısı" Widget

dart
Container(
  width: 200,
  height: 100,
  color: Colors.blue,
  padding: const EdgeInsets.all(16),
  margin: const EdgeInsets.all(8),
  child: Text('Merhaba'),
)

Container, tek başına birden fazla işi yapabilen (boyut verme, renk, boşluk, kenarlık) çok yönlü bir widget'tır. Bilmen faydalı bir detay: Container, aslında Flutter'ın kaynak kodunda kendi başına bir RenderObject'e sahip değildir — arka planda, verdiğin özelliklere göre (padding, color, margin vb.) Padding, DecoratedBox, ConstrainedBox gibi daha küçük widget'ları otomatik olarak birleştiren bir "kolaylık widget'ıdır" (bir nevi kompozisyon sarmalayıcısı). Yani Container yazdığında, Flutter arka planda senin için birden fazla widget'ı otomatik olarak iç içe geçiriyor. Bu, Bölüm 2 Konu 5'te öğrendiğimiz "küçük, tek işi yapan widget'ları birleştirme" felsefesinin, framework'ün kendi içinde de uygulandığını gösteriyor.

padding ile margin farkı:

  • padding: içerik ile widget'ın kendi sınırı arasındaki boşluk (içeriden).
  • margin: widget'ın sınırı ile çevresindeki diğer widget'lar arasındaki boşluk (dışarıdan).

Row ve Column — Yatay ve Dikey Dizilim

dart
Row(
  children: [
    Icon(Icons.star),
    Text('Yıldız'),
    Icon(Icons.favorite),
  ],
)

Row, çocuklarını yatay (soldan sağa) sıralar. Column, aynı mantıkla dikey (yukarıdan aşağıya) sıralar:

dart
Column(
  children: [
    Text('Birinci satır'),
    Text('İkinci satır'),
    Text('Üçüncü satır'),
  ],
)

mainAxisAlignment ve crossAxisAlignment:

dart
Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween, // ana eksen (yatay, Row için)
  crossAxisAlignment: CrossAxisAlignment.center,       // çapraz eksen (dikey, Row için)
  children: [
    Text('Sol'),
    Text('Sağ'),
  ],
)

"Ana eksen" (main axis) ve "çapraz eksen" (cross axis) kavramı önemli: Row için ana eksen yatay, çapraz eksen dikeydir. Column için bu tam tersidir — ana eksen dikey, çapraz eksen yataydır. Bu terminoloji tutarlı kalır, sadece Row/Column'a göre yön değişir.

MainAxisAlignment seçenekleri (Dart Bölüm 7'de öğrendiğimiz enum'ları hatırla — bu tam olarak bir enum'dur):

  • start, end, center — başa, sona, ortaya yasla.
  • spaceBetween — elemanlar arasına eşit boşluk (kenarlarda boşluk yok).
  • spaceAround — her elemanın etrafına eşit boşluk.
  • spaceEvenly — tüm boşluklar (kenarlar dahil) eşit.

Stack — Üst Üste Bindirme

dart
Stack(
  children: [
    Container(width: 200, height: 200, color: Colors.blue),
    Positioned(
      top: 20,
      left: 20,
      child: Text('Üstte yazı', style: TextStyle(color: Colors.white)),
    ),
  ],
)

Row/Column'ın aksine, Stack, çocuklarını üst üste (z-ekseninde) yerleştirir — listedeki ilk eleman en altta, son eleman en üstte görünür. Positioned, bir Stack çocuğunun tam olarak nereye yerleştirileceğini (üstten/soldan/sağdan/alttan mesafe ile) belirtir.

Ne zaman kullanılır? Bir resmin üzerine yazı bindirmek, bir bildirim rozeti (badge) eklemek gibi "katmanlı" tasarımlar için idealdir.

Padding — Sadece Boşluk

dart
Padding(
  padding: const EdgeInsets.all(16.0),
  child: Text('Etrafında boşluk olan metin'),
)

Container'ın aksine, Padding, sadece boşluk ekleme işini yapar — başka hiçbir şeyi yapmaz (renk veremez, boyut veremez). Bu, Bölüm 2 Konu 5'te öğrendiğimiz "tek sorumluluk" ilkesinin saf bir örneği.

EdgeInsets çeşitleri:

dart
EdgeInsets.all(16)                      // her yönden 16
EdgeInsets.symmetric(horizontal: 20, vertical: 10) // yatay 20, dikey 10
EdgeInsets.only(left: 8, top: 4)        // sadece belirtilen yönler

Align — Belirli Bir Konuma Hizalama

dart
Align(
  alignment: Alignment.topRight,
  child: Icon(Icons.close),
)

Align, çocuğunu ebeveyninin içinde belirtilen konuma yerleştirir. Alignment, aslında -1.0 ile 1.0 arasında bir koordinat sistemidir: Alignment(-1, -1) sol üst köşe, Alignment(1, 1) sağ alt köşe, Alignment(0, 0) tam orta.

Center — Align'ın Özel Bir Hali

dart
Center(
  child: Text('Ortalanmış'),
)

Bilmen faydalı bir detay: Center, Flutter'ın kaynak kodunda aslında Align'dan türeyen bir sınıftır (Dart Bölüm 7'de öğrendiğimiz extends kalıtımı) — alignment: Alignment.center ile sabitlenmiş bir Align'dır. Yani Center(child: X) yazmak, aslında Align(alignment: Alignment.center, child: X) yazmakla birebir aynı şeydir, sadece daha kısa ve niyeti daha net bir isim. Bu, Dart Bölüm 7'de öğrendiğimiz kalıtımın, "özel bir durumu daha kolay ifade etmek için" kullanılmasının gerçek bir örneği.

Bunları Bir Arada Kullanmak

dart
class ProfilKarti extends StatelessWidget {
  const ProfilKarti({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(16),
      color: Colors.grey[200],
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Ahmet Yılmaz'),
              Text('Flutter Geliştirici'),
            ],
          ),
          Icon(Icons.more_vert),
        ],
      ),
    );
  }
}

Bu örnek, öğrendiğin widget'ların (Container, Row, Column) gerçek bir arayüz parçası oluşturmak için nasıl birleştiğini gösteriyor — sol tarafta isim/unvan dikey sıralı, sağ tarafta bir ikon, ikisi arasında maksimum boşluk (spaceBetween).


🎯 Bu Dersten Çıkarılması Gerekenler

  • Container, birden fazla küçük widget'ı (Padding, DecoratedBox vb.) arka planda birleştiren çok amaçlı bir kolaylık widget'ıdır.
  • Row (yatay) ve Column (dikey), mainAxisAlignment/crossAxisAlignment ile dizilimi kontrol eder; ana/çapraz eksen, Row/Column'a göre yön değiştirir.
  • Stack, çocukları üst üste bindirir; Positioned, tam konumu belirler.
  • Padding, sadece boşluk ekler; Align, belirli bir konuma hizalar; Center, aslında Align'ın özel (ortalanmış) bir alt sınıfıdır.

📝 Ödevler

  • [ ] Container ile boyut, renk ve padding'i olan bir kutu oluştur.
  • [ ] Row içine 3 farklı widget koy, mainAxisAlignment'ı spaceBetween, spaceAround, spaceEvenly ile sırayla dene, farkı gözlemle.
  • [ ] Stack kullanarak bir Container'ın üzerine Positioned ile bir metin bindir.
  • [ ] Aynı sonucu üç farklı yöntemle (Center, Align(alignment: Alignment.center), ve mainAxisAlignment/crossAxisAlignment ile) elde et, hangisinin ne zaman daha uygun olacağını yorumla.
  • [ ] Konu 7'deki "ProfilKarti" örneğine benzer, kendi tasarladığın bir kart widget'ı yaz (en az Row + Column + bir ikon içersin).

🎮 Mini Uygulama — Basit Bir Kartvizit Ekranı

Öğrendiğin layout widget'larını birleştirerek, tek ekranlık bir dijital kartvizit tasarla. Gereksinimler:

  • Bir Container içinde, Column ile dikey sıralanmış:
    • Üstte bir daire (bir Container ile, borderRadius kullanarak — istersen Icon ile bir profil ikonu koy)
    • İsim ve unvan (Text widget'ları)
    • Alt kısımda, Row ile yatay sıralanmış 3 ikon (telefon, e-posta, konum gibi)
  • Padding ile genel kenar boşlukları ekle.
  • Center ile tüm kartı ekranın ortasına yerleştir.

Bu projede setState()'e ihtiyacın yok — sadece StatelessWidget ile statik bir arayüz kur. Amaç, bu derste öğrendiğin widget'ları gerçek bir kompozisyonda birleştirme pratiği yapmak.


Sıradaki konu: Bölüm 2 — Konu 8: Constraint Sistemi ("Constraints Go Down, Sizes Go Up, Parent Sets Position")