Flutter’da Temiz Network Katmanı [Dio + Freezed + Json_Annotation]

Selamlar Arkadaşlar,
Bu yazıda kendi projelerimde kullandığım network katmanını anlatacağım. Basitliği bozulmaması için herhangi bir state management paketi kullanmayacağım.

Kullanılan paketler
Network Katmanlarımız
Çalışma prensibi olarak Executer katmanında öncelikle internet kontolü yapılır.Ardından oluşturulan client için Network Creator katmanında istek yapılır.İsteğin başarılı olması durumunda Network Decoding katmanına geçilir. Decoding katmanında elde edilen data Response modele dönüştürülür. En sonunda Result tipinde geri dönüş değeri sağlanır.

Tüm katmanların kendine özgü birer hata tipi vardır.
- Request (Yapılan isteğin hatalı olması durumunda fırlatılır)
- Type (Decoding katmanında response modele çevrilirken hata alması durumunda fırlatılır)
- Connectivity (Network Executer katmanında internetin bağlantısının olup olmadığı ile ilgili kontroller sağlanır. İnternet bağlantısı yok ise geriye hata fırlatır)
Contracts
Client ve Response modellerimiz için contractslar yazmamız gerekiyor. Bu sayede ortak çatı altında çalışabileceğiz.
- BaseNetworkModel (Response modellerin bu sınıftan türemesi gerekmektedir)
- BaseClientGenerator (Clientların bu sınıftan türemesi gerekmektedir)
Network Options
Yapılan isteklerde farklı özellikleri kullanabilmek için oluşturduğumuz sınıf. İstediğiniz seçenekleri ihtiyaçlarınıza göre ekleyebilirsiniz.
Layers
- Network Creator
Verilen route değeriyle bir request örneği oluşturur.Aynı zamanda NetworkOptions için bu katmanda özellikleri atayabilirsiniz.
- Network Decoding
Data değerinin liste mi yoksa obje mi olduğunun kontrolü yapılır ve response modele dönüştürülür.
- Network Executer
Tüm işlemlerimizi çalıştıran katman burasıdır. Bu katmanda öncelikle internet kontrolü yapılır ardından route değerine göre request örneği oluşturulur ve çalıştırılır. Ardından elde edilen data response modele çevrilmeye çalışılır. Eğer işlemler başarılı ise geriye Result.success ile response model döndürülür. Hata alınması durumunda her katmanın hata tipine göre farklı bir NetworkError döndürülür.
Freezeds
- Result (Success ya da Failure döner)
- NetworkError (request,type,connectivity hatalarını döndürür)
Clients
Kullandığınız apinin hangi istekleri fazla ise (GET ya da POST) orElse methodu ile default değer belirleyebilirsiniz. Bu şekilde ekstradan her rota için bunu belirtmeniz gerekmez.
Daha kolay client oluşturmak için visual code için oluşturduğum eklentiyi kullanabilirsiniz.



Response Models
- PostModel
- UserModel
Service
Network executer parametreleri
Network.execute<T extends BaseNetworkModel, K>(route:BaseClientGenerator)
- route : Client tarafında tanımlanan rota.
- T : Response type tipi örnek PostModel
- K : Response type değerinin nasıl olması gerektiğini belirtiyoruz. Liste veya obje.
Aşağıda ki serviste K tipini bir liste olarak belirtiyoruz çünkü apiden dönen veriler bir liste içinde obje.
Kullanımı
Bu örnekte state management için bir paket kullanılmamıştır. Bir sonraki yazı MobX + Clean Network ile birlikte temiz mimari üzerine olacaktır.

Hataların Gösterimi
Hatanın hangi istekte ve hangi türde olduğunu daha kolay bulabilirsiniz.
Örnek olarak oluşturulan response model sınıfında type olarak yanlış verilmesi durumunda alacağınız hatanın gösterimi ve console çıktısı.
int? userId değerinin bool olarak değiştirilmesi durumunda
Console Ekranı

Uygulama

Özet
Bu kullanım ile 1 kere network katmanınızı yazıp bütün projelerinizde kullanabilirsiniz. Yapmanız gereken tek şey apinize uygun bir client oluşturmaktır. Yapınıza ve ihtiyaçlarınıza göre değiştirebilir, geliştirebilirsiniz.
Bir sonraki yazıya kadar sağlıcakla kalın 😊
Github Repo