Hot Reload — çalışan bir mobil uygulamanın kodunu yeniden başlatmadan ve mevcut durumu kaybetmeden güncellemeye olanak tanıyan bir teknoloji. Geliştirici kaynak kodu değiştirir — bir saniye içinde değişiklikler cihaz veya emülatör ekranında görünür. Bu, Flutter ve React Native'in temel bir özelliğidir ve geliştirme yinelemelerini kökten hızlandırır: düzenleme-görüntüleme döngü süresi 5–10 saniyeden (yeniden derleme) 300–500 milisaniyeye düşer. Flutter Documentation, 2025'e göre, hot reload değiştirilen kodun artımlı derlemesini yapar ve güncellemeyi Dart VM'ye gönderir.
Önemli Noktalar
Hot Reload, kaynak kodun değiştirildiği ve durdurulmadan çalışan bir uygulamaya uygulandığı bir geliştirme mekanizmasıdır. Geliştirici bir dosyayı düzenler, kaydeder ve 0.3–2 saniye içinde güncellenmiş arayüz ekranda belirir. Uygulama durumu (sayaçlar, kaydırma konumu, girilen veriler) korunur — geliştirici bağlamı kaybetmez.
Hot reload kavramı ilk web araçlarında (LiveReload, 2010) ortaya çıkmış ve Flutter (2017) ve React Native (2015) tarafından mobil geliştirmeye uyarlanmıştır. Günümüzde hot reload, hata ayıklama yapılandırması ve profillemenin yanı sıra modern mobil çerçevelerin zorunlu bir özelliğidir. Hot reload olmadan UI geliştirme verimsiz kabul edilir: her değişiklik incelemesi 10–30 saniyelik yeniden derleme ve başlatma gerektirir.
Teknik olarak hot reload üç adımdan oluşur: değişiklik algılama (dosya izleyici), değiştirilen kodun derlenmesi (artımlı derleyici) ve uygulama (sıcak yama). Her çerçeve bu adımları farklı şekilde uygular, ancak sonuç aynıdır: düzenleme ve görüntüleme arasında minimum gecikme.
Flutter'da Hot Reload, Dart VM mimarisi ve JIT derlemesi üzerine inşa edilmiştir. Geliştirici IDE'de “Hot Reload” düğmesine bastığında veya bir dosyayı kaydettiğinde, Flutter değiştirilen Dart kütüphanelerinin çekirdek dosyalarına (.dill) artımlı derlemesini yapar. Dart VM bu dosyaları yükler ve çalışan uygulamadaki değiştirilen fonksiyonların uygulamalarını değiştirir.
// Hot reload sırasında durumu korunan Flutter stateful widget
class CounterWidget extends StatefulWidget {
@override
State createState() => _CounterState();
}
class _CounterState extends State {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Sayaç: $_counter'),
ElevatedButton(
onPressed: () => setState(() => _counter++),
child: Text('Artır'),
),
],
);
}
}
Örnekte, StatefulWidget CounterWidget, hot reload sırasında _counter alanını korur. Dart VM, reassemble() çağrısı yaparak durumu (State) yeniden oluşturur, ancak _counter'ı sıfırlamaz — widget tamamen yeniden oluşturulmadıkça değer korunur. Flutter tüm State nesneleri için reassemble() çağrısı yapar ve build() güncellenmiş kod ve korunan durumla yeniden çalıştırılır.
Hot reload ne zaman çalışmaz: statik bir başlatma değişkeni (static const), global değişken, main(), enum/mixin sınıf bildirimi veya @override initState() içindeki kod değiştirilmişse. Bu durumlarda Hot Restart gerekir. Flutter Team (2025)'e göre, hot reload vakaların %85–90'ında başarılıdır; değişikliklerin %10–15'i tam yeniden başlatma gerektirir.
Dart VM hata ayıklama modunda bir JIT derleyici olarak çalışır: Dart kodunu çekirdek formatı (bayt koduna benzer) aracılığıyla yorumlar. Hot reload yeni bir çekirdek dosyası yükler ve eski fonksiyon tanımlarını değiştirir. VM, isolate'leri yeniden başlatmaz — tüm asenkron işlemler (Future, Stream) çalışmaya devam eder. Sürüm modunda Dart AOT (dart2native) ile derlenir ve hot reload kullanılamaz.
Fast Refresh (önceden Hot Reloading) React Native'de Metro bundler kullanır — dosya değişikliklerini izleyen bir JavaScript modül paketleyicisidir. Geliştirici bir dosyayı kaydettiğinde, Metro yalnızca değiştirilen modülü (HMR — Hot Module Replacement) derler ve WebSocket aracılığıyla çalışan uygulamaya güncellemeyi gönderir.
// Hot reload sırasında durumu koruyan React Native bileşeni
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<View>
<Text>Sayaç: {count}Text>
<Button title="Artır"
onPress={() => setCount(c => c + 1)} />
View>
);
};
Fast Refresh, modül güncellenirken React durumunu (useState, useReducer) korur. Metro HMR yalnızca değiştirilen modülün farkını (diff) iletir — tüm paketi değil. React Native, React ekibi (Dan Abramov, 2019) tarafından geliştirilen React Fast Refresh'i kullanır: bileşen için yeni bir render oluşturur ancak bileşen imzası değişmediyse hook durumlarını ve props'ları korur.
Fast Refresh şu değişikliklerde çalışmaz: bileşen dışa aktarımı, hook'lar (useEffect, useMemo), modül bağımlılıkları ve yerel modüller (Java/Objective-C). Bu tür değişiklikler Reload (tam JS paketi yeniden yükleme) veya Rebuild (yerel kod yeniden derleme) gerektirir. Fast refresh süresi — 200–800 ms, tam reload — 2–5 saniye.
Hot Reload ve Hot Restart, farklı kullanım senaryolarına sahip iki kod güncelleme modudur. Hot Reload, sınıf yapısı ve durum türü değişmediğinde UI değişiklikleri (stiller, düzen, renkler, metinler) için uygundur. Hot Restart, metot imzalarının değiştirilmesi, kök ağaca yeni widget/bileşen eklenmesi, initState ve yerel modüllerin değiştirilmesi durumunda gereklidir.
| Özellik | Hot Reload | Hot Restart |
|---|---|---|
| Hız | 0.3–2 saniye | 2–10 saniye |
| Durum koruma | Evet (değişkenler, state, navigasyon yığını) | Hayır (uygulama yeniden başlar) |
| Derleme | Artımlı (sadece değişiklikler) | Tam Dart/JS yeniden derleme |
| Ne zaman kullanılır | UI ayarlamaları, stiller, metinler, düzen | Yapısal değişiklikler, yeni modüller, yerel kod |
| Flutter | Hot Reload (R) | Hot Restart (Shift + R) |
| React Native | Fast Refresh | Reload (Cmd + R) |
Önerilen strateji: hot reload ile başlayın. Değişiklikler uygulanmazsa (IDE “Reload needed” gösteriyorsa) — hot restart yapın. Flutter'da buton simgesi değişir: şimşek (⚡) hot reload için, üstü çizili şimşek restart gerekiyorsa. Tam yeniden derlemelere kıyasla hot reload ile geliştirme verimliliği %40–60 daha yüksektir (JetBrains Developer Survey 2024 verileri).
Kod enjeksiyonu (code injection), tüm çerçeveler tarafından kullanılan hot reload'in genel mekanizmasıdır. Üç aşamadan oluşur. Birinci — değişiklik algılama: bir dosya izleyici (IDE'ye entegre) veya dosya sistemi (FSNotify) .dart, .js, .tsx dosyasındaki değişikliği algılar. İkinci — derleme: artımlı derleyici yalnızca değiştirilen dosyayı bir ara temsile (Dart için çekirdek .dill, JS için HMR modülü) dönüştürür. Üçüncü — uygulama: yeni kod cihaza gönderilir ve çalışan uygulamanın belleğindeki eski tanımları değiştirir.
Sıcak fonksiyon değiştirme (hot patching), çalışma zamanının sanal metot tablosundaki fonksiyon işaretçisini değiştirdiği bir tekniktir. Dart VM, ClassTable — yüklenen tüm sınıfları içeren iç yapıyı kullanır. Hot reload sırasında VM, ClassTable'da sınıfı bulur ve fonksiyon tanımlarını çekirdek dosyasındaki yenileriyle değiştirir. Mevcut tüm sınıf örnekleri otomatik olarak yeni davranışı alır.
// Flutter: hot reload sonrası durum yönetimi için reassemble geri çağrısı
class MyWidget extends StatefulWidget {
@override
State createState() => _MyState();
}
mixin ReloadAware on State {
@override
void reassemble() {
super.reassemble();
// Hot reload sonrası önbelleği veya verileri sıfırla
clearCache();
}
}
Örnekte, ReloadAware mixin'i, Dart VM'nin hot reload'den sonra her State nesnesinde çağırdığı reassemble() metodunu geçersiz kılar. Geliştirici önbelleği sıfırlayabilir, kaynakları yeniden başlatabilir veya durum geçişi gerçekleştirebilir. Bu metot olmadan, eski veriler önbellekte kalabilir ve widget güncellemelerinden sonra tutarsızlığa neden olabilir.
Sıcak yama, yeni alanlar için bellek yeniden tahsisi, bir sınıfta değişken türünün değiştirilmesi, StatefulWidget'a yeni alanlar eklenmesi, enum değerlerinin veya genel parametrelerin değiştirilmesini gerektiren değişiklikler için çalışmaz. Bu değişiklikler bellektekimevcut nesnelerle uyumsuzdur — Dart VM önceden tahsis edilmiş nesnelerdeki alanları “karıştıramaz”. Bu gibi durumlarda, hot restart veya tam yeniden derleme gerekir.
Yerel Android ve iOS geliştirmesi geleneksel olarak tam hot reload'e sahip değildir. Android Studio, Android 11+ ve AGP 4.2+ ile Apply Changes'i destekler: uygulamayı yeniden başlatmadan kod güncellemesi. Apply Changes, Android Runtime (ART) aracılığıyla çalışır — anında dex dosyalarındaki metot uygulamalarını değiştirir. Ancak Apply Changes sınırlıdır: kaynak değişiklikleri (layout.xml, drawable), manifest ve yerel kütüphaneler için çalışmaz.
Apple, Xcode 15'te (2023) Previews'i (SwiftUI Preview) tanıttı — bu klasik anlamda hot reload değildir. Previews, önizleme bölümünü ana uygulamadan ayrı olarak derler ve sonucu Xcode tuvalinde gösterir. Bir dosya kaydedildiğinde, önizleme 1–3 saniyede güncellenir, ancak uygulama durumu korunmaz. UIKit projeleri için hot reload, üçüncü taraf araçlar aracılığıyla kullanılabilir: InjectionIII (John Holdsworth) ve SwiftHotReload.
Kotlin Multiplatform (KMP), 2024'ten itibaren JetBrains'ten deneysel hot reload desteği aldı. Mekanizma, nesne dosyasındaki (.klib) fonksiyon değiştirme ile Kotlin/Native runtime'a dayanır. JetBrains Compose Multiplayer, Flutter'a benzer kendi hot reload uygulamasını kullanır: Kotlin/Native runtime'da artımlı derleme ve sınıf değiştirme. Hız — 1–3 saniye, yalnızca UI değişiklikleri için kullanılabilir.
Apply Changes, ART runtime API'sini kullanan bir Android Studio mekanizmasıdır. Kod kaydedildiğinde, Android Studio hangi sınıfların değiştiğini belirler ve adb aracılığıyla bunların dex dosyalarını cihaza gönderir. ART, durdurmadan çalışan uygulamadaki metot uygulamalarını değiştirir. Apply Changes üç modda çalışır: Instant Run (hızlı metot değiştirme), Swap (örnek yeniden oluşturma ile sınıf değiştirme) ve Restart Activity (değişiklikler mevcut durumla uyumsuzsa).
Sıkça Sorulan Sorular
Hot Reload uygulamayı yeniden başlatmadan kodu günceller ve durumu korur. Live Reload, dosyalar değiştiğinde tüm uygulamayı veya web sayfasını yeniden yükler. Live Reload uygulaması daha basittir ancak daha yavaştır ve durumu kaybeder. Flutter ve React Native hot reload kullanır; web araçları live reload kullanır.
Hot Reload, bellek yeniden tahsisi gerektiren değişiklikler (yeni sınıf alanları), statik sabitlerin (static const) değiştirilmesi, widget'ların yeniden adlandırılması, enum veya genel parametrelerin değiştirilmesi durumunda çalışmaz. Bu değişiklikler, Dart VM veya JavaScript runtime belleğindeki mevcut nesnelerle uyumsuzdur.
Evet, hot reload hem fiziksel cihazlarda hem de emülatörlerde çalışır. Flutter çekirdek dosyalarını USB (adb forward) veya Wi-Fi aracılığıyla cihaza gönderir. React Native, Metro bundler aracılığıyla WebSocket kullanır. Fiziksel cihazdaki gecikme genellikle emülatöre göre %10–30 daha yüksektir.
Xcode Previews (2021'den beri) SwiftUI için hot reload'in bir benzeridir, ancak sınırlamalarla: önizlemeler ayrı olarak derlenir, uygulama navigasyonunu ve karmaşık durumları desteklemez. Apple iOS için resmi hot reload sağlamamaktadır. Üçüncü taraf araçlar: InjectionIII ve SwiftHotReload, kod enjeksiyonu için Objective-C Runtime kullanır.
Hot reload sonrası UI yanlış görüntüleniyorsa: hot restart yapın. Sorun verilerdeyse — Flutter'da reassemble() geri çağrısını veya React Native'de useEffect cleanup'i kontrol edin. Kalıcı sorunlar için Flutter Clean veya Reset Metro Cache kullanın. Bir hata yalnızca reload sonrasında tekrarlanıyorsa — bu, değişikliklerin mevcut durumla uyumsuzluğunun bir işaretidir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun