Flutter 💙 State Management Nedir?

Furkan KURT
3 min readOct 2, 2020
Flutter 💙

Merhabalar! Medium’u kullanmakta biraz geciksem de bir yerden başlamak lazım dedim ve 2 yıllık Flutter geliştirme deneyimimde öğrendiğim ve hayatı gerçekten kolaylaştıran bilgiler veren yazılar yazacağım. Başlangıç seviyesi değil, orta ve ileri seviye bilgiler sizlerle olacak :)

Öncelikle ilk yazımı ‘State Management’ namı diğer ‘Durum Yönetimi’ konusunda yazmaya karar verdim. Flutter ile tanışıp yazılım yazan arkadaşların ‘State Management’ olayını tam olarak anlayamadığı ya da kafalarının karıştığını düşündüğüm için bu yazıyı yazmak istedim.

Aslında işin özü tam olarak şu Flutter ile uygulama geliştirirken ekranda güncelleme yapmak istediğimiz yerleri StatefulWidget ile setState metoduyla çok güzel yapabiliyoruz evet. Peki ya uygulamanın her yerinde birden çok ve gerçek zamanlı bir güncelleme olması gerekiyorsa ne yapacağız? Her yeri setState ile güncellememiz biraz spagetti koda dönüşebilir. İşte tam bu noktada ‘State Management’ çözümleri çıkıyor karşımıza.

State Management (Flutter Dökümanından)

‘State Management’ için hazırlanmış birçok paket bulunmakta pub.dev adresinde. Bu paketlerin farklı farklı olmasının birçok sebebi bulunmakta. Örneğin BLoC paketini kullanırsanız her bir state için 3 farklı dosya ve bu dosyaların içinde birden çok defa fonksiyon yazmanız gerekecek. Basit ve sade bir uygulama isteyen biri BLoC paketinden koşarak uzaklaşsın derim.

Ben orta seviye arkadaşlarım için Provider paketini kullanmalarını öneriyorum. Ben de Flutter’a başladığımdan beri kullanıyorum kendisini. Daha önce yaptığım projelerin hiçbirinde bir sorun çıkartmadı. Flutter official dökümanında da ‘State Management’ yöntemi seçiminde söylenilen bir söz var. Hangisinin en iyi olduğunu değil senin hangisinde daha iyi olduğun önemli. Hangi yöntem senin için en kolaysa o yöntemi seçip proje mimarini oluşturabilirsin!

Bu nedenle Provider açıkçası biçilmiş kaftan. (Proje mimarisi için de bir yazı yazacağım.)

Şimdi gelelim Provider’ın ne olduğuna ve nasıl çalıştığına; (Anlatımı Flutter dökümanındaki kodları referans alarak yapıyorum.)

Bir stateful widget oluşturduğumuzda elimizde initState() dispose() ve build() gibi methodlar geliyor. Provider kullanmadan ekranda görünen bir veriyi değiştirmek istediğimizde bunu setState() fonksiyonu içine çağırarak yapıyoruz. Provider kullandığımızda ise buna hiç gerek kalmıyor.

Provider entegrasyonu öncelikle kullanacağımız widget’ın bir üst widget’ına ekleyeceğimiz ChangeNotifierProvider widget’ı ile başlar. Projenin tümünde kullanacağımız için en üst widget olan MaterialApp’ı ChangeNotifierProvider ile sarmalıyoruz. ChangeNotifierProvider’ın bir create fonksiyonu ve bir child widget’ı mevcut. Child’ı zaten bizim MaterialApp’imiz olacak. Create fonksiyonunda ise ChangeNotifier ile extend edilmiş sınıfımız döndürülecek.

Bu örnekte sadece tek bir ChangeNotifier sınıfını ekledik. Peki birden fazla ChangeNotifier sınıfımız varsa ne mi yapacağız? Çözüm basit, yine Provider paketi ile gelen MultiProvider widget’ını kullanacağız.

Aşağıdaki kod örneğinde de bir CartModel görüyorsunuz. Bu CartModel ise Flutter frameworkünde bulundan ChangeNotifier ile extend edilmiş. Bu da demek ki ChangeNotifier’ın tüm fonksiyonlarını artık CartModel’imizde kullanabiliriz.

Şimdi gelelim buradaki değişiklikleri nasıl dinleyeceğimize. Consumer adındaki bu hayat kurtarıcı widget’ımız dinlenmek istenilen widget ile sarmalanıyor. Ancak bu widget’ın child parametresine koyduğunuz widget, dinleme yapmaz!!. Dinleyeceğimiz widget’ı Consumer’ın builder fonksiyonu içine yazmamız gerekiyor. Builder içinde ChangeNotifier ile extend edilmiş sınıfımızdaki tüm nesnelere ulaşabilir ve dinleyebiliriz.

Burada önemli olan bir mesele daha var. Consumer’ı yalnızca değiştirmek istediğiniz widget ile sarmalamalısınız. Eğer aşağıdaki örnekteki gibi yaparsanız fazladan bellek kaybına uğramış olursunuz, performans düşer.

Provider’dan gelen verileri initState içinde widget’lar yüklenmeden ulaşmak istiyorsanız örnekteki gibi kullanabilirsiniz.

Vee geldik yazımızın sonuna… Umarım yazdıklarım ufacık da olsa işinize yaramıştır. Konu hakkındaki herhangi bir sorunuz olursa hiç çekinmeden bana ulaşabilirsiniz. Elimden geldiği kadarıyla yardımcı olmaktan mutluluk duyarım.

Sağlıklı günler dilerim…

--

--