Flutter, cross platform uygulama geliştirmeye olanak verdiği için Flutter uygulamalarını optimize etmek hayati önem taşır. Farklı cihazlara uygulama geliştirmeye olanak sunduğu için, performans önemli bir parametre halini alır. Bu yazımda uygulama performansını arttıracak ve ram kullanımını optimize edebilmenizi sağlayacak bazı önerilerde bulunacağım.

Constant kullanımı

Const keyword’u kullanımı, uygulamanızda yazdığınız widgetlar’ın compile anında bir kere derlenip, daha sonra derlenmemesi için kullanılır. Optimizasyon için önemlidir çünkü yeni bir state’e geçişte daha önce oluşturulmuş const widgetlar ile yeni state’in derlenme süresi kısaltılmış olur.

Sağdaki resimde gösterildiği üzere, “Add ‘const’ modifiers everywhere in file” opsiyonuna tıklayarak dosyadaki uygun tüm yerlere kısa yoldan const keyword’u ekleyebilirsiniz. 🙂

setState kullanmamak

setState fonksiyonu, Flutter’da kullanılan en güçlü fonksiyonlardan biridir. Stateful Widget nedir yazımda anlattığım setState fonksiyonu, kullanıldığında widget tree’yi tamamıyla yeniden derlenmeye zorlar. Bu da performans olarak olumsuz sonuçlar doğurabilir.

Kontrol operatörleri

Ternary operator kullanımını biliyorsanız, Dart dilinde bunları daha farklı şekilde yazmanız gerekebilir. Eski tip ternary operator kullanımları uygulamaya atomik de olsa yük bindiriyor. Örnek vermek gerekirse:

var available = isAvailable == null ? false : true // Eski tip
var available = isAvailable ?? true                // Yeni tip

(value as Shop).name = "Starbucks"                 // Eski tip
if(value is Shop) value.name = "Starbucks"         // Yeni tip

String objeleri

String değişkenlerini oluştururken, birden fazla veriyi birleştirerek bir String oluşturmak istiyorsanız, objeleri yan yana yazıp toplamak yerine, $ işareti kullanarak bir String oluşturun. Örneğin:

var gununTarihi = gun + '-' + ay + '-' + yil; // yanlış
var gununTarihi = '$gun-$ay-$yil';            // doğru

Listeler ile doğru çalışmak

Sıklıkla yaptığım bir hatadan bahsetmek istiyorum. Genellikle list objelerini map ile anonim fonksiyona çevirerek ve widget return edip bu widgetlar’ı toList ile liste haline getiren bir yapı kullanıyorum. Fakat bu yaptığım şey, büyük listelerde kesinlikle kullanılmaması gerekiyor. Büyük listelerdeki verileri UI tarafına aktarmak istiyorsanız, ListView kullanmalısınız.

ListView kullanırken, ekranda gözükmeyen widgetların öldürülmesini sağlayabilirsiniz. Ram tarafında size alan sağlayacak olan bu yöntem, CPU ve GPU’yu daha çok çalıştıracaktır. Bu yüzden bu ikiliyi kullanacağınız yerleri iyi seçmeniz gerekir.

addAutomaticKeepAlives: false
addRepaintBoundaries: false


Stateless Widget kullanımı

Yazdığınız Widget return eden fonksiyonları, StatelessWidget olarak dönüştürürseniz eğer, bu sınıflar compile zamanında derleneceği için uygulamanızı çok daha optimize hale getirecektir.

Dispose kullanımı

StatefulWidget içerisinde dispose fonksiyonu kullanımı önemlidir. Dispose, StatefulWidget öldürülmeden önce uğranılan son noktadır. Bu noktada daha önce oluşturduğunuz Controller objelerini, Provider objelerini vs. öldürmeniz, dispose etmeniz gerekmektedir. Bunu yaparak bu objelerin ramde ölü biçimde durmasını engellemiş oluyoruz yani belleğin şişmesini önlüyoruz.

Örnek dispose kullanımı

Flutter Uygulamalarını Optimize Etme – Sonuç

Flutter’da uygulama geliştirirken kullandığım optimizasyon yöntemlerini bu yazıda elimden geldiğince açıklamaya çalıştım. 🙂 2 yıldan uzun süredir Flutter ile geliştirme yapıyorum ve Flutter framework’u geliştirildikçe ortaya birçok farklı konu çıkıyor. Hepsini öğrenmek zaman alıyor ve bunları yazmak daha çok zaman alıyor. Önümüzdeki günlerde fırsat bulduğumda bir Flutter paketi yayınlayıp, bir Flutter paketi nasıl yayımlanır hakkında yazı yazmayı düşünüyorum. 🙂 Gelişmelerden haberdar olmak için takipte kalın.


Okuyucuya Not

Merhaba okuyucu! Blogum son zamanlarda yüksek trafik almaya başladı ve bu durumdan memnunum fakat aynı zamanda siz ziyaretçileri tatmin edememekten endişeliyim. 🙂 Eğer yazılarım ile ilgili bir tavsiyeniz olursa mail adresimden bana ulaşabilir veya Twitter üzerinden direct message gönderebilirsiniz. Github’ta örnek olarak yaptığım projelere göz atmak isterseniz de bu linki kullanabilirsiniz. Umarım bu ziyaretinizle size bir şeyler katabilmişimdir.

Sağlıcakla kalın!

Tags: