Bölüm 1 — Konu 1: Flutter Nedir, Mimarisi (Widget → Element → RenderObject, Skia/Impeller)
Dizi · 1/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 11 başlık
- Flutter Nedir?
- "Diğer Çözümlerden Farkı Ne?" — Kısa Bir Karşılaştırma
- Widget Ağacı — "Her Şey Widget'tır" Felsefesi
- Üç Katmanlı Mimari — Widget, Element, RenderObject
- 1. Widget Ağacı — "Ne İstiyorum" (Konfigürasyon)
- 2. Element Ağacı — "Hayat Döngüsü ve Konum" (Yönetim)
- 3. RenderObject Ağacı — "Nasıl Çizilecek" (Gerçek Çizim)
- Skia ve Impeller — Flutter'ın Çizim Motorları
- Bu Bilgi Neden Şimdi Önemli?
- 🎯 Bu Dersten Çıkarılması Gerekenler
- 📝 Ödevler
Flutter tutorial'ına hoş geldin! Dart'ı sağlam bir şekilde öğrendiğin için, bu bölümde artık dil sözdizimiyle değil, Flutter'a özgü kavramlarla ilgileneceğiz.
Flutter Nedir?
Flutter, Google tarafından geliştirilen, tek bir kod tabanından iOS, Android, Web, Windows, macOS ve Linux için native performanslı uygulamalar üretmeni sağlayan bir UI framework'üdür. "Framework" kelimesi önemli — Flutter bir dil değil (dili Dart'tır, zaten öğrendin), bir kütüphane/araç setidir; sana widget'lar, layout sistemi, animasyon motoru, render motoru gibi bir uygulama geliştirmek için gereken her şeyi sağlar.
"Diğer Çözümlerden Farkı Ne?" — Kısa Bir Karşılaştırma
Mobil geliştirmede birkaç temel yaklaşım vardır:
- Native geliştirme (Swift/iOS, Kotlin/Android) — en yüksek performans, ama iki ayrı kod tabanı yazman gerekir.
- Köprü tabanlı framework'ler (React Native gibi) — JavaScript kodu yazarsın, bu kod native bileşenlere köprülenir (bridge). Bu köprü, bir performans darboğazı yaratabilir.
- Flutter'ın yaklaşımı — Dart kodu, doğrudan native makine koduna derlenir (Bölüm 12'de öğrendiğin AOT derleme) ve Flutter, ekrana kendi çizim motoruyla (birazdan göreceğiz) her pikseli kendisi çizer. Native UI bileşenlerine (Android'in Button'u, iOS'un UIButton'u gibi) hiç dokunmaz — bunun yerine, aynı görünümü kendi motoruyla her platformda birebir aynı şekilde üretir.
Bu üçüncü yaklaşım, Flutter'ın "her platformda piksel piksel aynı görünüm" vaadinin temelidir — native bileşenlere bağımlı olmadığı için, bir Android'de görünen bir buton ile iOS'ta görünen aynı buton, gerçekten aynı kod tarafından çizilir.
Widget Ağacı — "Her Şey Widget'tır" Felsefesi
Flutter'ın en temel felsefesi şudur: ekranda gördüğün her şey bir widget'tır. Bir metin, bir buton, bir boşluk (padding), hatta bazı durumlarda bir animasyon bile — hepsi birer widget'tır.
// Bu, ileride yazacağın gerçek koda çok benzer bir önizleme
Widget build(BuildContext context) {
return Center(
child: Text("Merhaba Flutter"),
);
}Burada Center bir widget, Text de bir widget — ve Text, Center'ın çocuğu (child). Bu, Bölüm 7'de (Dart) öğrendiğin kalıtım ve kompozisyon kavramlarının somut bir uygulamasıdır — Flutter'daki her widget, aslında Dart'ta bir class'tır (Widget'tan türeyen).
Widget'lar, bu şekilde iç içe geçerek bir ağaç (tree) yapısı oluşturur:
MaterialApp
└── Scaffold
└── Center
└── Text("Merhaba Flutter")Bu ağaç yapısı kavramı, Bölüm 4'te (Dart) öğrendiğimiz koleksiyon/veri yapıları kavramına benzer bir mantıkla çalışır — her widget'ın çocukları olabilir, ve tüm uygulama, bu iç içe geçmiş widget'lar ağacından oluşur.
Üç Katmanlı Mimari — Widget, Element, RenderObject
Flutter'ın iç mimarisi, aslında üç ayrı ağaçtan oluşur — bu, Flutter'ın performansının ve esnekliğinin temelidir. Bunu anlamak, ileri seviye Flutter geliştirmede (özellikle performans optimizasyonu, Bölüm 9'da göreceğiz) kritik önemde.
1. Widget Ağacı — "Ne İstiyorum" (Konfigürasyon)
Widget'lar, Bölüm 2'de (Dart) öğrendiğimiz immutable (değişmez) veri sınıfları gibi düşünülebilir — bir widget, "ekranda bunu şöyle görmek istiyorum" diyen basit bir açıklama (blueprint)'tir. Widget'ların kendisi, hiçbir görsel çizim yapmaz — sadece "ne istediğini" tarif eder.
2. Element Ağacı — "Hayat Döngüsü ve Konum" (Yönetim)
Her widget, bir Element ile eşleştirilir. Element, widget ağacındaki konumu ve yaşam döngüsünü yönetir — widget'lar sürekli yeniden oluşturulurken (Bölüm 2'de bunu detaylı göreceğiz), Element'ler daha kalıcıdır ve widget'ların "kimliğini" (aynı widget'ın güncellenmiş bir versiyonu mu, yoksa tamamen yeni bir widget mı olduğunu) takip eder.
3. RenderObject Ağacı — "Nasıl Çizilecek" (Gerçek Çizim)
RenderObject'ler, gerçek layout hesaplamasını (boyut, konum) ve gerçek çizimi yapan katmandır. Bölüm 2'de öğreneceğimiz "constraints go down, sizes go up" prensibi, tam olarak bu katmanda gerçekleşir.
Neden üç ayrı katman? Bu ayrım, Flutter'a büyük bir performans avantajı sağlar: bir widget her "yeniden oluşturulduğunda" (rebuild), Flutter, Element ve RenderObject ağaçlarını sıfırdan yeniden oluşturmak zorunda kalmaz — sadece neyin gerçekten değiştiğini karşılaştırır (buna "diffing" denir, Bölüm 13'te öğrendiğimiz kod üretimi kavramına benzer bir "akıllı güncelleme" mantığı) ve sadece gerekli değişiklikleri uygular. Bu, Bölüm 13'te (Dart) öğrendiğimiz garbage collection'ın "gereksiz nesne oluşturmaktan kaçınma" felsefesine paralel bir performans optimizasyonudur.
Skia ve Impeller — Flutter'ın Çizim Motorları
Widget'ların "ne çizileceğini" belirlediğini, RenderObject'lerin "nasıl çizileceğini" hesapladığını gördük. Peki bu çizim, fiziksel olarak ekrana nasıl aktarılıyor?
Skia, Google'ın geliştirdiği, açık kaynaklı bir 2D grafik motorudur — Flutter'ın uzun süredir kullandığı render motoru. Skia, RenderObject'lerin ürettiği "çizim talimatlarını" alıp, bunları doğrudan GPU'ya (ekran kartına) göndererek pikselleri boyar.
Impeller, Flutter ekibinin geliştirdiği daha yeni bir render motorudur — Skia'nın bazı performans sınırlamalarını (özellikle "shader derleme takılması" denen, ilk kez çizilen bir efektte oluşan kısa donmalar) çözmek için tasarlandı. Impeller, önceden derlenmiş shader'lar kullanarak, çalışma zamanında beklenmedik takılmaları önlemeyi hedefliyor.
Şu anki durum: Flutter, platforma göre kademeli olarak Impeller'a geçiş yapıyor (iOS'ta varsayılan hale geldi, Android'de de aktif geliştirme altında). Bu, Bölüm 12'de (Dart) öğrendiğimiz JIT/AOT derleme ikiliğine benzer bir mühendislik kararı — Impeller, "önceden hazırlanmış" bir yaklaşımla, çalışma zamanı sürprizlerini azaltmayı hedefliyor.
Bu Bilgi Neden Şimdi Önemli?
Bu ders, biraz soyut görünebilir — henüz hiç kod yazmadık. Ama bu mimariyi baştan anlamak, ileride:
- Bölüm 6'da (Flutter)
setState()'in neden ve nasıl çalıştığını, - Bölüm 9'da (Flutter) performans optimizasyonlarının neden işe yaradığını,
- Ve genel olarak "widget ağacı" mantığıyla düşünmeyi
çok daha kolay kavramanı sağlayacak. Şimdi, bir sonraki derste elini koda değdireceksin — ortam kurulumuyla.
🎯 Bu Dersten Çıkarılması Gerekenler
- Flutter, Dart kodunu native makine koduna derleyip, kendi çizim motoruyla ekranı kendisi çizen bir UI framework'üdür — native bileşenlere bağımlı değildir.
- "Her şey widget'tır" — ekrandaki her öğe, iç içe geçmiş bir widget ağacı oluşturur.
- Flutter'ın iç mimarisi üç katmandan oluşur: Widget (ne isteniyor), Element (yaşam döngüsü/konum), RenderObject (nasıl çizilecek) — bu ayrım, performanslı güncellemeleri mümkün kılar.
- Skia, Flutter'ın köklü render motoru; Impeller, shader takılmalarını önlemek için geliştirilen daha yeni motor.
📝 Ödevler
- [ ] Kendi cümlelerinle, "Flutter'ın native bileşenlere bağımlı olmaması" ile "her platformda piksel piksel aynı görünüm" arasındaki ilişkiyi açıkla.
- [ ] Widget/Element/RenderObject üçlüsünü, gerçek hayattan bir benzetmeyle (örneğin bir mimari plan, inşaat yöneticisi, inşaat işçisi gibi) kendi örneğinle açıkla.
- [ ] Skia ile Impeller arasındaki temel farkı (shader derleme takılması bağlamında) kendi cümlelerinle özetle.
- [ ] React Native'in "köprü" (bridge) yaklaşımı ile Flutter'ın yaklaşımını karşılaştıran kısa bir not yaz — hangi senaryoda hangisinin avantajlı olabileceğini düşün.
Sıradaki konu: Bölüm 1 — Konu 2: Ortam Kurulumu (Flutter SDK, Android Studio/VS Code, Emulator/Simulator, Flutter DevTools'a İlk Bakış)