↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 1 — Konu 4: Hot Reload / Hot Restart Ne Yapıyor, Neden Önemli

4 dk okuma #flutter
Dizi · 4/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 11 başlık
  1. Hot Reload Nedir?
  2. Somut Bir Deney
  3. Hot Reload'ın Arkasında Ne Oluyor? — Dart Bölüm 12'ye Bağlantı
  4. Hot Restart — Farklı Bir Araç
  5. Ne Zaman Hot Reload Yetmez, Hot Restart Gerekir?
  6. Neden Bu Kadar Önemli? — Geliştirici Deneyimine Etkisi
  7. flutter run Terminalindeki Diğer Kısayollar
  8. Küçük Bir Deney Daha — State'in Korunduğunu Kanıtlamak
  9. 🎯 Bu Dersten Çıkarılması Gerekenler
  10. 📝 Ödevler
  11. 🏁 Bölüm 1 Tamamlandı!

Bölüm 1'in son konusundayız. Dart Bölüm 12 Konu 57'de JIT/AOT derlemeyi işlerken hot reload'a değinmiştik — şimdi bunu gerçek anlamda deneyimleyerek tam olarak anlayacağız.

Hot Reload Nedir?

Hot reload, uygulamanı yeniden başlatmadan, kod değişikliklerini anında (genelde bir saniyeden kısa sürede) uygulamana yansıtma özelliğidir.

Nasıl tetiklenir?

  • Terminalde flutter run çalışırken, r tuşuna bas.
  • VS Code'da, kaydettiğinde (Ctrl+S/Cmd+S) otomatik tetiklenecek şekilde ayarlanabilir, ya da yıldırım simgesine tıklanır.

Somut Bir Deney

lib/main.dart dosyasında (varsayılan sayaç uygulamasında), şu satırı bulalım:

dart
Text(
  '$_counter',
  style: Theme.of(context).textTheme.headlineMedium,
),

Bu metnin rengini değiştirelim:

dart
Text(
  '$_counter',
  style: Theme.of(context).textTheme.headlineMedium?.copyWith(color: Colors.red),
),

Dosyayı kaydet (hot reload otomatik tetiklenir) — uygulamanın sayacı sıfırlanmadan, sayı rengi anında kırmızıya dönüşür!

Hot Reload'ın Arkasında Ne Oluyor? — Dart Bölüm 12'ye Bağlantı

Dart Bölüm 12 Konu 57'de JIT derlemenin "kod her değiştiğinde tüm programı baştan derlemek gerekmez" özelliğini öğrenmiştik. Hot reload, tam olarak bunu kullanır:

  1. Kod değiştiğinde, Flutter sadece değişen kısımların yeni bir versiyonunu, çalışan Dart VM'ine (JIT ile) enjekte eder.
  2. Flutter, widget ağacını (Bölüm 1 Konu 1'de öğrendiğimiz) yeni kodla yeniden oluşturur (rebuild).
  3. Önemli olan: uygulamanın state'i (durumu) korunur! Sayaç değeri 5 iken hot reload yaptıysan, hâlâ 5'tir — sadece görünüm/davranış güncellenir.

Hot Restart — Farklı Bir Araç

metin
Terminalde 'R' (büyük harf) tuşuna bas

Hot restart, hot reload'dan farklıdır — uygulamayı tamamen yeniden başlatır, ama yine de (AOT derlemeye göre) hızlıdır, çünkü tam bir "cold start" (sıfırdan derleme + yükleme) değildir.

Fark tam olarak nerede?

Hot Reload Hot Restart
Hız Çok hızlı (< 1 saniye genelde) Biraz daha yavaş (birkaç saniye)
State (durum) korunur mu? ✅ Evet ❌ Hayır, sıfırlanır
main() yeniden çalışır mı? ❌ Hayır ✅ Evet
Ne zaman gerekir? Widget ağacı/UI değişiklikleri State yapısı, global değişkenler, initState gibi başlangıç mantığı değiştiğinde

Ne Zaman Hot Reload Yetmez, Hot Restart Gerekir?

Hot reload, her değişikliği yansıtamaz — çünkü sadece "aynı state ile devam edilebilecek" değişiklikleri güvenle uygulayabilir. Şu durumlarda hot restart gerekir:

dart
// Örnek: Bir sınıfın alan yapısını değiştirmek
class Sayac {
  int deger = 0;
  // int yeniAlan = 10; // Bu tarz bir değişiklik, HOT RELOAD ile bazen sorun çıkarabilir
}
  • main() fonksiyonunun içeriğini değiştirdiğinde (hot reload, main()'i tekrar çalıştırmaz).
  • Global değişkenlerin başlangıç değerini değiştirdiğinde.
  • Bir State sınıfının (Bölüm 1 Konu 6'da göreceğiz) alan yapısını (yeni bir alan eklemek gibi) değiştirdiğinde — bazen hot reload bunu doğru yansıtamaz, "state uyumsuzluğu" görebilirsin.
  • Genel kural: Eğer hot reload sonrası garip/beklenmedik bir davranış görüyorsan, hot restart dene — bu, çoğu "hot reload çalışmıyor gibi" sorununun çözümüdür.

Neden Bu Kadar Önemli? — Geliştirici Deneyimine Etkisi

Bölüm 1 Konu 1'de Flutter'ın Dart'ı seçme sebeplerinden birinin JIT'in hot reload'ı mümkün kılması olduğunu söylemiştik. Şimdi bunun pratik değerini görüyorsun:

Hot reload olmadan bir dünya hayal et: Bir butonun rengini değiştirmek istiyorsun. Kodu değiştiriyorsun, tüm uygulamayı yeniden derlemen (native derleme, birkaç dakika sürebilir), yeniden yüklemen, ve eğer bu buton, bir dizi tıklamadan sonra ulaşılan bir ekrandaysa, o tıklamaları tekrar tekrar yapman gerekiyor — her küçük görsel değişiklik için.

Hot reload ile: Rengi değiştir, kaydet, bir saniye içinde sonucu gör — hatta derinlemesine bir ekranda, belirli bir state'teyken bile, o state korunarak değişikliği anında görürsün.

Bu, Flutter'ın geliştirici verimliliğinin en büyük kaynaklarından biridir — "değiştir, gör, tekrar değiştir" döngüsünü saniyeler seviyesine indirir.

flutter run Terminalindeki Diğer Kısayollar

metin
r  -> Hot reload
R  -> Hot restart
p  -> Widget sınırlarını (performans overlay'ini) göster/gizle
o  -> Platform temasını değiştir (Android/iOS arası geçiş, test amaçlı)
q  -> Uygulamayı sonlandır (quit)

Bu kısayolları bir sonraki bölümlerde, gerçek geliştirme yaparken sürekli kullanacaksın.

Küçük Bir Deney Daha — State'in Korunduğunu Kanıtlamak

  1. Sayaç uygulamasında, butona birkaç kere tıkla (sayaç 3 olsun diyelim).
  2. Kodda, Text('$_counter') satırının üzerine yeni bir Text widget'ı ekle (örneğin Text('Merhaba!')).
  3. Hot reload yap (r).
  4. Gözlemle: Sayaç hâlâ 3 gösteriyor, ve yeni eklediğin "Merhaba!" metni de görünüyor — state kaybolmadı, sadece widget ağacı güncellendi.

Bu deney, Bölüm 1 Konu 1'de öğrendiğimiz Widget/Element/RenderObject ayrımının neden var olduğunu somut olarak gösteriyor: Element ağacı, widget'lar değişse bile kalıcılığını ve state'ini koruyor.


🎯 Bu Dersten Çıkarılması Gerekenler

  • Hot reload, kodu JIT ile çalışan uygulamaya enjekte ederek, state'i koruyarak, saniyeler içinde değişiklikleri yansıtır.
  • Hot restart, uygulamayı tamamen yeniden başlatır (main() dahil), state sıfırlanır — ama tam bir cold start'tan daha hızlıdır.
  • Hot reload, widget ağacı/UI değişiklikleri için idealdir; global değişken/state yapısı değişikliklerinde hot restart gerekebilir.
  • Bu özellik, Flutter'ın "değiştir-gör" geliştirme döngüsünü dramatik şekilde hızlandırır ve geliştirici verimliliğinin temel taşlarından biridir.

📝 Ödevler

  • [ ] Sayaç uygulamasında bir metnin rengini/boyutunu değiştir, hot reload ile anlık güncellemeyi gözlemle.
  • [ ] Sayacı birkaç kere artır, sonra hot reload yap — state'in korunduğunu doğrula.
  • [ ] Aynı senaryoyu hot restart ile tekrarla — bu sefer state'in sıfırlandığını gözlemle.
  • [ ] main() fonksiyonunun içine bir print() ekle, hot reload sonrası bu print'in çalışmadığını, hot restart sonrası çalıştığını terminalde gözlemle.
  • [ ] flutter run terminalindeki diğer kısayolları (p, o) dene, her birinin ne yaptığını gözlemle.

🏁 Bölüm 1 Tamamlandı!

Flutter'ın ne olduğunu, iç mimarisini (Widget/Element/RenderObject, Skia/Impeller), ortamı kurmayı, proje yapısını ve hot reload/restart mekaniğini öğrendin. Artık gerçek bir Flutter projesini çalıştırabiliyor ve üzerinde değişiklik yapabiliyorsun.

Sıradaki durak Bölüm 2 — Widget'larla Düşünmek: "her şey widget'tır" felsefesini derinleştirecek, StatelessWidget vs StatefulWidget ayrımını ve temel layout widget'larını (Container, Row, Column) işleyeceğiz — burada gerçekten kendi arayüzünü yazmaya başlayacaksın.