Flutter ile Performans Optimizasyonu: Hızlı ve Düşük Bellek Tüketimli Uygulamalar - S1 (Temel Seviye)

Oğuzhan Küçüksaraç
Etiya
Published in
4 min readJul 27, 2023

--

Performans - Seri 1 (Temel Seviye) Giriş:

Flutter, günümüzde giderek daha fazla geliştiricinin tercih ettiği popüler bir Framework’tür. Cross platform desteği, hızlı geliştirme süreçleri ve mükemmel kullanıcı arayüzleri sunması, Flutter’ın bu kadar ilgi görmesinin temel nedenlerindendir. Ancak, uygulamalar geliştikçe performans sorunları ortaya çıkabilir ve bunlar kullanıcı deneyimini olumsuz yönde etkileyebilir. Neyse ki, Flutter, performans optimizasyonu için güçlü araçlar ve teknikler sunar.

Bu makalede, Flutter ile performans optimizasyonu yapmanın bazı en iyi yöntemlerine odaklanacağız. Hızlı ve düşük bellek tüketimli uygulamalar oluşturmak için aşağıdaki adımları izleyebilirsiniz:

1. Gereksiz Widget Yapılarından Kaçının

Gereksiz Widget kullanımı: Flutter, Widget ağacı yapısıyla çalışır ve her bir Widget, arayüzde farklı öğeleri temsil eder. Gereksiz Widget’lar, Widget ağacını gereksiz yere derinleştirebilir ve performansı olumsuz etkileyebilir.Bu durum, hafıza tüketimini artırır ve performansı düşürür.

Bunun yerine, yalnızca ihtiyacınız olan Widget’ları kullanmaya özen gösterin ve gereksiz yapıları önlemek için düzenli kod incelemeleri yapın.

// Kötü örnek: Gereksiz Widget kullanımı
@override
Widget build(BuildContext context) {
return Container(
child: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.star),
Text('Örnek Widget'),
],
),
);
}

// İyi örnek: Gereksiz Widget kullanımından kaçınma
@override
Widget build(BuildContext context) {
return const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.star),
Text('Örnek Widget'),
],
);
}

2. Stateless ve Stateful Widget’ları Doğru Kullanın

Flutter’da, Stateless ve StatefulWidget olmak üzere iki tür Widget bulunur. StatelessWidget’lar, durumu değiştiremez ve genellikle statik arayüz öğelerini temsil eder. StatefulWidget’lar ise durumu değiştirebilir ve dinamik arayüzler oluşturmak için kullanılır.

Uygulamanızda, durumu değişmeyecek arayüz öğeleri için StatelessWidget’ları, değişen durumlara sahip öğeler için StatefulWidget’ları kullanmak en iyisidir. Durumu olmayan öğeler, yeniden oluşturma işlemlerinden etkilenmez ve performansı artırır.

class TodoWidget extends StatelessWidget {
const TodoWidget({super.key});

// İyi örnek: Doğru Widget Kullanımı
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(10),
child: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.star),
Text('Örnek Widget'),
],
),
);
}
}

class Todo2Widget extends StatefulWidget {
const Todo2Widget({super.key});

@override
State<Todo2Widget> createState() => _Todo2WidgetState();
}

class _Todo2WidgetState extends State<Todo2Widget> {
// Kötü örnek: Yanlış Widget Kullanımı
@override
Widget build(BuildContext context) {
return const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.star),
Text('Örnek Widget'),
],
);
}
}

3. ListView ve GridView gibi Kaydırılabilir Widget’ları Verimli Kullanın

Flutter’da, uzun listeler veya Grid’lar gibi kaydırılabilir Widget’lar, çok sayıda öğeyi ekran üzerinde göstermek için kullanılır. Bu tür Widget’ları verimli kullanmak, uygulamanızın bellek tüketimini azaltabilir ve kaydırma performansını artırabilir.

Bunun için, ListView.builder veya GridView.builder kullanarak yalnızca görünür olan öğeleri oluşturmak ve diğer öğeleri ekranda görünmediği sürece oluşturmaktan kaçınmak önemlidir.

// Kötü örnek: ListView ile tüm öğeleri oluşturma
ListView(
children: myLargeList.map((item) => ListItemWidget(item)).toList(),
)

// İyi örnek: ListView.builder ile yalnızca görünür öğeleri oluşturma
ListView.builder(
itemCount: myLargeList.length,
itemBuilder: (context, index) => ListItemWidget(myLargeList[index]),
)

4. Gereksiz Animasyonlardan Kaçının

Flutter, etkileyici animasyonlar oluşturmanızı sağlayan güçlü bir animasyon sistemi sunar. Ancak, aşırı animasyon kullanımı, performans sorunlarına neden olabilir. Animasyonlar, işlemci ve bellek gücünü tüketir. Bu nedenle, animasyonları yalnızca kullanıcı etkileşimlerini vurgulamak veya önemli bilgileri iletmek için kullanmak önemlidir.

Unutmayın, bazı durumlarda animasyonlar kullanıcı deneyimini artırabilir, ancak gereksiz animasyonlar performansı düşürebilir.

5. Bellek Yönetimini İzleyin ve Bellek Sızıntılarından Kaçının

Bellek yönetimi, mobil uygulama performansı için kritik öneme sahiptir. Doğru bellek yönetimi yapmak, uygulamanızın hızlı ve verimli çalışmasını sağlar. Aynı zamanda, bellek sızıntılarından kaçınmak, uygulamanızın gereksiz yere bellek tüketimine yol açmasını önler.

Bellek sızıntıları, kullanılmayan bellek bloklarının serbest bırakılmaması sonucu oluşan durumlardır. Uygulamanızda bellek sızıntısı varsa, uygulamanız çalışmaya devam etse bile, kullanılmayan bellek sürekli olarak birikecektir. Bu durum zamanla uygulamanızın performansını düşürebilir ve hatta uygulamanızın çökmesine neden olabilir.

Flutter, bellek yönetimi konusunda geliştiricilere yardımcı olmak için çeşitli araçlar ve teknikler sunar:

a. Widget Yaşam Döngüsü

StatefulWidget’lar kullanırken, Widget’inizin yaşam döngüsünü doğru yönetmek önemlidir. Uygulamanızda kullanılmayan State nesneleri bellekte gereksiz yere kalabilir ve bellek sızıntılarına yol açabilir.

Widget’inizle ilişkilendirilen durum değiştiğinde, eski State nesnesi yerine yeni bir State nesnesi oluşturulur ve eski nesne bellekten otomatik olarak serbest bırakılır. Ancak, durum değişikliği sonucu eski nesnenin hala referansları varsa, bellek sızıntısı oluşabilir.

Bu nedenle, StatefulWidget’larınızda gereksiz referansları temizlemeye dikkat edin ve gereksiz uzun ömürlü nesnelerden kaçının.

class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
MyObject _myObject = MyObject(); // State nesnesine atanan referans

@override
Widget build(BuildContext context) {
// ...
}

@override
void dispose() {
_myObject.dispose(); // Gereksiz referansları temizleyin
super.dispose();
}
}

Dip Not: Bellek yönetimi ve bellek sızıntılarından kaçınmak, Flutter uygulamanızın performansını önemli ölçüde artırır. Yukarıdaki teknikleri kullanarak, uygulamanızın bellek kullanımını izleyebilir ve gereksiz yere bellek tüketen nesneleri ortadan kaldırabilirsiniz. Bellek sızıntılarını önlemek için düzenli olarak kod incelemesi yapmak ve test etmek de büyük önem taşır.

Önemli bilgilendirme !

Bu makale Flutter ile Performans Optimizasyonu serisinin birincisi olup Temel seviye optimizasyon teknikleri barındırmaktadır. Serinin devamı geldiğinde buradan referans verilecektir.
Serinin devamını merak ediyorsanız, takipte kalmayı unutmayınız. 😊

Özet

Bu makale, Flutter ile performans optimizasyonu yapmak isteyen geliştiricilere temel bir kılavuz sağlamak amacıyla hazırlanmıştır. Performans optimizasyonu süreci, her proje için farklılık gösterebilir, bu nedenle projenize özgü performans iyileştirmelerini incelemeyi unutmayın. Uygulamanızın gereksinimlerine ve kullanılan Widget’ların karmaşıklığına bağlı olarak, daha spesifik optimizasyon teknikleri uygulayabilirsiniz.

Umarım bu makale, Flutter uygulamanızı daha hızlı, verimli ve düşük bellek tüketimli hale getirme konusunda size yardımcı olur. Keyifli kodlamalar ve başarılı uygulamalar dilerim! 😊

--

--