Flutter Performans Optimizasyonu: Junk ve Takılmaları Önleyin Görseli

Flutter Performans Optimizasyonu: Junk ve Takılmaları Önleyin

19.10.2026 | 22

Mobil uygulama geliştirme dünyasında cross-platform çözümler, native performansa yaklaşma iddiasıyla her geçen gün daha fazla tercih ediliyor. Ancak gücün yanında büyük sorumluluklar da getiriyor. Flutter, her ne kadar Skia ve yeni nesil Impeller grafik motorlarıyla üst düzey bir akıcılık sunsa da, yanlış mimari kararlar ve bilinçsiz widget ağaçları (widget tree) Junk (kare düşüşü) kaçınılmaz hale getirir.

Flutter Uygulamalarında Junk Nedir ve Neden Olur?

Kullanıcı arabiriminde (UI) hedeflenen kare hızının (genellikle 60Hz veya 120Hz cihazlarda 120fps) altına düşülmesi, animasyonlarda takılmalara ve kaydırma (scrolling) işlemlerinde donmalara yol açar. Bu duruma halk arasında takılma, teknik olarak ise Junk denir. Ana iş parçacığının (Main Isolate) 16 milisaniyeden (60 FPS için) uzun süren işlemlerle bloke edilmesi, frame atlanmasına neden olur.

Flutter main isolate frame drop and junk visualization Görseli
Flutter main isolate frame drop and junk visualization

1. Const Constructors Kullanarak Gereksiz Yeniden Oluşturmaları Önleyin

Flutter'da en sık yapılan hatalardan biri, değişmeyen widget'ların her build döngüsünde yeniden oluşturulmasıdır. const anahtar kelimesi, Dart derleyicisine bu nesnenin derleme zamanında (compile-time) oluşturulduğunu ve bellek adresinin değişmeyeceğini söyler.

// YANLIŞ: Her build işleminde yeniden belleğe alınır
Widget build(BuildContext context) {
  return Column(
    children: [
      Text('Kullanıcı Listesi'),
      // ...
    ],
  );
}

// DOĞRU: Bellekte bir kez oluşturulur ve referans alınır
Widget build(BuildContext context) {
  return const Column(
    children: [
      Text('Kullanıcı Listesi'),
      // ...
    ],
  );
}

2. Widget Ağacını Küçültün ve Parçalara Ayırın

Büyük ve tek parça halinde yazılmış build metotları, küçük bir state değiştiğinde tüm ağacın yeniden çizilmesine (rebuild) yol açar. Bunun yerine widget'ları küçük parçalara ayırmak veya Builder / RepaintBoundary kullanmak kritik önem taşır.

Mimari İpucu: Ağacınızı küçültmek için her UI bileşenini kendi özelleştirilmiş StatelessWidget sınıfına bölün. Böylece Flutter, sadece state'i değişen spesifik alt dalı yeniden çizer.

3. RepaintBoundary ile Maliyetli Boyama İşlemlerini İzole Edin

Karmaşık grafikler, gölgeler veya özel çizimler (CustomPainter) içeren alanlar, ekranda her piksel güncellendiğinde yeniden boyanır. Bu durumu engellemek için RepaintBoundary widget'ı ile katmanı rasterize edip önbelleğe (cache) alabilirsiniz:

RepaintBoundary(
  child: CustomPaint(
    painter: ComplexGraphPainter(),
  ),
);

4. Bellek Sızıntıları (Memory Leak) ve Dart Garbage Collector

StreamSubscription, AnimationController veya TextEditingController gibi nesneler işleri bittiğinde kapatılmadığında (dispose edilmediğinde) bellek sızıntılarına yol açar. Bu durum Garbage Collector (GC) üzerinde baskı kurarak ani duraksamalara neden olur. Her zaman dispose() metodunu ezerek (override) bu kaynakları serbest bırakın.

Performans optimizasyonu tek seferlik bir görev değil, sürekli sürdürülmesi gereken bir mühendislik disiplinidir. Profiling araçlarını (Flutter DevTools) düzenli olarak kullanarak CPU ve Memory haritalarını inceleyin, darboğazları erken safhada tespit edin.

| |