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

Ercan Garip
3 min readSep 1, 2021

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.

easyclient

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

--

--