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