Bölüm 6 — Konu 28: Karşılaştırma — Hangi Projede Hangisi?
Dizi · 28/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 13 başlık
- Hepsinin Ortak Temeli — Kısa Bir Hatırlatma
- Karşılaştırma Tablosu — Tüm Kriterler Bir Arada
- Proje Büyüklüğüne Göre Karar Rehberi
- Küçük Proje / Öğrenme Amaçlı / Hızlı Prototip
- Orta Ölçekli Proje / Bireysel Geliştirici / Küçük Takım
- Büyük Ölçekli Proje / Çok Geliştiricili Takım / Kurumsal Uygulama
- GetX Ne Zaman Mantıklı?
- Karar Verirken Sorman Gereken Sorular
- Bu Tutorial'da Bundan Sonra Ne Kullanacağız?
- Değişmeyen Gerçek — Hangisini Seçersen Seç
- 🎯 Bu Dersten Çıkarılması Gerekenler
- 📝 Ödevler
- 🏁 Bölüm 6 Tamamlandı!
Bölüm 6'nın son konusundayız. Bu ders, yeni bir kavram öğretmiyor — Konu 23-27'de öğrendiğin her şeyi birleştirip, gerçek bir karar verme çerçevesi sunuyor.
Hepsinin Ortak Temeli — Kısa Bir Hatırlatma
Bölüm 6 Konu 23'te öğrendiğimiz gibi, hepsi aynı temel mekanizmaya dayanıyor: InheritedWidget. Fark, bu mekanizmanın **üzerine hangi "arayüzün" (API) inşa edildiğidir:
InheritedWidget (Flutter'ın çekirdek mekanizması)
│
├── Provider (elle InheritedWidget yazmanın kolaylaştırılmış hali)
│ │
│ └── flutter_bloc (Provider'ı arka planda kullanır)
│
├── Riverpod (context bağımsız, daha tip güvenli bir yeniden tasarım)
│
└── GetX (kendi global registry sistemi, context'i tamamen atlar)Karşılaştırma Tablosu — Tüm Kriterler Bir Arada
| Kriter | Provider | Riverpod | BLoC/Cubit | GetX |
|---|---|---|---|---|
| Öğrenme eğrisi | Düşük | Orta | Orta-Yüksek | Düşük |
| Boilerplate (tekrarlayan kod) | Orta | Orta | Yüksek (tam BLoC) | Düşük |
| Context bağımlılığı | Var | Yok | Var | Yok |
| Tip güvenliği | Orta | Yüksek | Yüksek | Orta |
| Test edilebilirlik | İyi | Çok iyi | Çok iyi | Orta |
| İzlenebilirlik ("neden değişti?") | Zayıf | Orta | Güçlü (tam BLoC) | Zayıf |
| Flutter ekibinin resmi önerisine yakınlık | Yüksek | Yüksek | Orta | Düşük |
| Topluluk büyüklüğü | Çok büyük | Büyük, hızla artıyor | Büyük | Büyük ama tartışmalı |
| "Hepsi bir arada" (navigasyon, DI dahil) | Hayır | Hayır | Hayır | Evet |
Proje Büyüklüğüne Göre Karar Rehberi
Küçük Proje / Öğrenme Amaçlı / Hızlı Prototip
Öneri: Provider veya GetX
Bölüm 6 Konu 24'te öğrendiğimiz Provider, az kavramla (watch/read/select) hızlı sonuç verir. GetX (Konu 27), daha da az kod ile benzer bir hız sunar. Bu aşamada, mimari kaygılardan çok, öğrenmeye ve hızlı iterasyona odaklanmak mantıklıdır.
Orta Ölçekli Proje / Bireysel Geliştirici / Küçük Takım
Öneri: Riverpod
Bölüm 6 Konu 25'te öğrendiğimiz gibi, Riverpod'un context bağımsızlığı ve derleme zamanı güvenliği, projenin büyümesiyle birlikte daha az hata anlamına gelir. Provider'a çok benzer bir zihniyetle çalıştığı için, geçiş kolaydır.
Büyük Ölçekli Proje / Çok Geliştiricili Takım / Kurumsal Uygulama
Öneri: Riverpod veya Tam BLoC
Bölüm 6 Konu 26'da öğrendiğimiz tam BLoC pattern'in event-driven yapısı, birden fazla geliştiricinin "bu state neden değişti" sorusunu, kod tabanının herhangi bir yerinden anlayabilmesini sağlar — bu, büyük takım koordinasyonu için değerlidir. Riverpod da, tip güvenliği ve test edilebilirliği sayesinde bu ölçekte gayet iyi çalışır.
GetX Ne Zaman Mantıklı?
Bölüm 6 Konu 27'de dengeli bir şekilde işlediğimiz gibi, GetX'in hız avantajı, küçük-orta ölçekli, tek geliştiricili veya küçük takımlı projelerde değerlidir. Büyük, uzun soluklu projelerde, disiplinli kullanılmazsa (global state'in kontrolsüz büyümesi), bakım zorlaşabilir — bu yüzden büyük kurumsal projelerde daha az tercih edilir.
Karar Verirken Sorman Gereken Sorular
- Kaç kişi bu kod üzerinde çalışacak? Tek başınaysan, esneklik önceliklidir. Takım büyüdükçe, yapı ve öngörülebilirlik daha değerli hale gelir.
- Proje ne kadar uzun soluklu? Kısa ömürlü bir MVP/prototip için, hız öncelikli. Yıllarca sürecek bir uygulama için, sürdürülebilirlik öncelikli.
- Test yazmayı ne kadar önemsiyorsun? Dart Bölüm 12 Konu 55'te öğrendiğimiz unit test kültürü güçlüyse, Riverpod/BLoC'un test edilebilirlik avantajı öne çıkar.
- Ekibin önceden bir deneyimi var mı? Zaten bir ekip Provider veya BLoC biliyorsa, tutarlılık için aynı aracı kullanmak genelde en mantıklısıdır — "en iyi" araç yerine "ekibin bildiği" araç, pratikte genelde kazanır.
Bu Tutorial'da Bundan Sonra Ne Kullanacağız?
Flutter tutorial'ının ilerleyen bölümlerinde (özellikle Bölüm 7'de mimari konularında, ve daha ileri projelerde), genellikle Provider veya Riverpod örnekleri kullanacağız — çünkü bunlar, Flutter ekibinin resmi dokümantasyonunda en çok referans verilen, ve Bölüm 6 Konu 23'te öğrendiğimiz temel InheritedWidget mekanizmasına en yakın duran araçlardır. Ama artık hepsinin temel mantığını bildiğin için, hangi projede hangisiyle karşılaşırsan karşılaş, hızlıca adapte olabileceksin.
Değişmeyen Gerçek — Hangisini Seçersen Seç
Bölüm 6'nın tamamında öğrendiğimiz en önemli ders, aslında araçların kendisinden bağımsız:
- Dart Bölüm 6'da öğrendiğimiz encapsulation (state'i private tutup, kontrollü metodlarla değiştirme) her zaman önemlidir — hangi aracı kullanırsan kullan.
- Dart Bölüm 4'te öğrendiğimiz immutable koleksiyonlar (
List.unmodifiablegibi), state'in dışarıdan kontrolsüzce değiştirilmesini önlemede her zaman değerlidir. - Bölüm 2 Konu 6'da öğrendiğimiz
setState()'in temel rebuild mekanizması, hangi state management aracını kullanırsan kullan, arka planda hâlâ çalışıyor — bu araçlar,setState()'in yerini almaz, onu daha organize bir şekilde tetiklemenin yollarını sunar.
🎯 Bu Dersten Çıkarılması Gerekenler
- Provider, Riverpod, BLoC ve GetX, hepsi temelde
InheritedWidget'a dayanır, farklı "arayüzler" sunarlar. - Küçük/prototip projeler için Provider veya GetX; orta ölçek için Riverpod; büyük, çok geliştiricili projeler için Riverpod veya tam BLoC genelde tercih edilir.
- Karar verirken: takım büyüklüğü, projenin ömrü, test kültürü ve ekibin önceki deneyimi göz önünde bulundurulmalıdır.
- Hangi aracı seçersen seç, temel prensipler (encapsulation, immutability,
setState()'in arka planda çalışan rebuild mekanizması) değişmez.
📝 Ödevler
- [ ] Kendi hayalindeki bir proje fikri düşün (örn. bir not alma uygulaması), yukarıdaki karar rehberine göre hangi state management aracını seçeceğine karar ver ve gerekçelendir.
- [ ] Aynı basit uygulamayı (örn. sayaç), Bölüm 6'da öğrendiğin 4 araçtan (Provider, Riverpod, Cubit, GetX) en az ikisiyle yazıp, kod miktarı ve okunabilirlik açısından karşılaştır.
- [ ] Kendi cümlelerinle, "state management aracı seçmek, setState()'in yerini almak değil, onu organize etmenin bir yoludur" cümlesini açıkla.
- [ ] Bir arkadaşına (ya da kendine), hangi durumda hangi aracı önereceğini anlatan kısa bir "karar ağacı" (flowchart tarzı, metin olarak da olabilir) yaz.
🏁 Bölüm 6 Tamamlandı!
State management'ın temellerini (InheritedWidget) ve dört büyük çözümünü (Provider, Riverpod, BLoC/Cubit, GetX) öğrendin — artık hem neden bu araçlara ihtiyaç duyulduğunu hem de her birinin nasıl çalıştığını biliyorsun, ve projene göre bilinçli bir seçim yapabiliyorsun.
Sıradaki durak Bölüm 7 — İleri Navigasyon & Mimari: Navigator 2.0, go_router, deep linking, repository pattern, dependency injection ve Clean Architecture ile, büyük, sürdürülebilir uygulamalar kurmayı öğreneceğiz.