↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 6 — Konu 28: Karşılaştırma — Hangi Projede Hangisi?

4 dk okuma #flutter
Dizi · 28/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 13 başlık
  1. Hepsinin Ortak Temeli — Kısa Bir Hatırlatma
  2. Karşılaştırma Tablosu — Tüm Kriterler Bir Arada
  3. Proje Büyüklüğüne Göre Karar Rehberi
  4. Küçük Proje / Öğrenme Amaçlı / Hızlı Prototip
  5. Orta Ölçekli Proje / Bireysel Geliştirici / Küçük Takım
  6. Büyük Ölçekli Proje / Çok Geliştiricili Takım / Kurumsal Uygulama
  7. GetX Ne Zaman Mantıklı?
  8. Karar Verirken Sorman Gereken Sorular
  9. Bu Tutorial'da Bundan Sonra Ne Kullanacağız?
  10. Değişmeyen Gerçek — Hangisini Seçersen Seç
  11. 🎯 Bu Dersten Çıkarılması Gerekenler
  12. 📝 Ödevler
  13. 🏁 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:

metin
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

  1. 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.
  2. 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.
  3. 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.
  4. 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.unmodifiable gibi), 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.