Bölüm 1 — Konu 4: Hot Reload / Hot Restart Ne Yapıyor, Neden Önemli
Dizi · 4/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
- Hot Reload Nedir?
- Somut Bir Deney
- Hot Reload'ın Arkasında Ne Oluyor? — Dart Bölüm 12'ye Bağlantı
- Hot Restart — Farklı Bir Araç
- Ne Zaman Hot Reload Yetmez, Hot Restart Gerekir?
- Neden Bu Kadar Önemli? — Geliştirici Deneyimine Etkisi
- flutter run Terminalindeki Diğer Kısayollar
- Küçük Bir Deney Daha — State'in Korunduğunu Kanıtlamak
- 🎯 Bu Dersten Çıkarılması Gerekenler
- 📝 Ödevler
- 🏁 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,rtuş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:
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),Bu metnin rengini değiştirelim:
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:
- 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.
- Flutter, widget ağacını (Bölüm 1 Konu 1'de öğrendiğimiz) yeni kodla yeniden oluşturur (rebuild).
- Önemli olan: uygulamanın state'i (durumu) korunur! Sayaç değeri
5iken hot reload yaptıysan, hâlâ5'tir — sadece görünüm/davranış güncellenir.
Hot Restart — Farklı Bir Araç
Terminalde 'R' (büyük harf) tuşuna basHot 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:
// Ö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
Statesı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
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
- Sayaç uygulamasında, butona birkaç kere tıkla (sayaç
3olsun diyelim). - Kodda,
Text('$_counter')satırının üzerine yeni birTextwidget'ı ekle (örneğinText('Merhaba!')). - Hot reload yap (
r). - Gözlemle: Sayaç hâlâ
3gö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 birprint()ekle, hot reload sonrası buprint'in çalışmadığını, hot restart sonrası çalıştığını terminalde gözlemle. - [ ]
flutter runterminalindeki 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.