Dart Yansıma(Reflection) Gücü

Veli Bacık
KoçSistem
Published in
4 min readDec 16, 2019

Bazen keşke elimde olsa dersiniz ya işte o an “reflection” zamanı 💪

reflection flutter

Bugün neler konuşacağız 👨‍💻 👩‍💻

  • Yansıma(Reflection) nedir ?
  • Yansıma neden önemli ?
  • Dart dilinde nasıl kullanabiliriz ?
  • Flutter ile entegrasyonu ve çalışması
  • Flutter ile bir örnek uygulama geliştirme

Haydi, önce biraz konuşalım sonra geliştirmemizi tamamlayalım 👊

Yansıma nedir ?

Yansıma bizlerin hayatında her zaman olan fakat çok fazla kullanmadığımız veya ihtiyaç duymadığımız bir terim olarak karşımıza çıkıyor. Reflection, uygulamalarımız çalışırken herhangi bir sınıfı herhangi bir anda çağırmamızı ve onun özelliğini kullanmamızı sağlar.

https://haptik.ai/tech/using-reflection-in-android/

Yansıma Neden Önemli ?

Uygulamalarımızı geliştirirken ilk aşamalarında çok hızlıca bildiklerimizi bir yapı dahilinde değil, gelir geçer şekilde başlarız ama ilerledikçe biz bu durumları ortaklaştırmak temizlemek amacı ile çeşitli “yazılım desenleri(design pattern)” dediğimiz kavramları kullanırız. Bu kavramlardan biriside “Ortak Tasarım (Repository Design)” dediğimiz yönetimimiz mevcut bu yöntem ile biz bir çok isteğimizi tek bir ana merkezden kontrol edebiliyoruz. Fakat şöyle bir durum var; bize gelen istekler çok fazla ekrandan gelebilir ve bu ekranlardan gelen tiplere görede bir sonuç döndürmemiz gerekebilir işte tam bu noktada o gelen bilgileri toplayıp o bilgilerin bir yansımasını oluşturarak, onların bir kaç özelliğine erişip bunu kullanıp kullanıcıya istediği durumu döndürmüş oluruz.

Ve bu kadar okumamızın ardından aslında tam teknik karşılığı şu şekilde diyebiliriz : Çalışma zamanı(Runtime) da bir genel değişken parametreyi okuyup bundan gerçek bir değişken veya sınıf oluşturarak, bu nesneye erişip bunun özelliğini kullanıp, geri döndürmek diyebiliriz.

https://apprize.info/c/essential/17.html

Dart ve Yansıma

Bu konuda ise tabiki Google bir çözüm üretmiş olup “dart:mirror” kütüphanesi çekirdek(core) dil içerisine eklemiş ve kullanıma sunmuş. Fakat bunu kullanmak şu anki durumlarda pek mümkün gözükmüyor, zaten sayfada bu paketin “kararsız” olarak işaretlendiğini görebilirsiniz. Paket flutter tarafında direk erişebilir bir durumda değil bunun içinde birkaç ayar yaparak erişebiliyorsunuz.

Bunu gören Google’daki yazılım geliştirici ekibi bizler için “reflectable” adında çok güzel bir paket geliştirdiler. Peki bu paket ne yapıyor diyeceksiniz; bu paket bizim konuştuğumuz gibi bir işaretleme(annotation) yaparak o sınıfın çalışma zamanında erişebilir olmasını sağlıyoruz. Bu işlemi yaparken bir ufak derleme(build) işlemi yapmanız da gerekiyor.

Flutter ile Kurulum ve Kullanım Senaryosu

Adım adım gidelim.

  • Önce bir flutter projesi açılır.
    flutter create “Proje İsmi” (küçük harfle olması ve çift tırnak olmasına gerek yok.)
  • Projemizin “pubspec.yaml” dosyasına gelinip aşağıdaki kod eklenir.

Burada bir önemli nokta “any” kullanımına dikkat etmek. Bu kullanım sizin istediğiniz paketi size uygun olacak versiyona uygun olarak çekmekte.(Bunun ile ilgili net bir döküman göremedim. Bu biraz kendi yorumum bu konuda bilgisi olan paylaşımda bulunursa bir sonrakine düzeltmiş olurum)

  • Şimdi sıra bir sınıf oluşturmakta.
  • Oluşturduğumuz bu sınıfa yansıma özelliği vermek için öncelikle yansıma sınıfımızı tanımlamamız gerekmektedir.

Burada yaptığımız haraket reflectable sınıfı üzerinden miras alarak yeni bir sınıf oluşturuyoruz. Buradaki süper metodunda biz üst sınıfımıza yapabilecek yeteneklerimizi(capabilitiy) gönderiyoruz. Bunların detayını bir sonraki yazılarda işleyeceğiz.

// newInstanceCapability,

// invokingCapability,

// reflectedTypeCapability,

// typingCapability,

// declarationsCapability,

  • Artık yansıma görevi yapacak sınıfımız da hazır olduğuna göre “Hello” sınıfımıza son bir ekleme yaparak sınıfın ismin üstüne bir işaret ekliyoruz.

Ve artık hazırız gerekli sınıfımız ve onun yapabileceklerini tanımladık gelin şimdi bunu nasıl kullanacağımıza bakalım.

Peki ne yapacağız?

Flutter uygulamamızdan bir Hello tipi ile istek atacağız ve bunu hiçbir obje eklemeden yapıp, yansıma sayesinde setMessage ve print metodlarıyla tanımlayacağız.

Flutter Dünyası

Dart tarafında tüm tanımlamalarımızı yaptık, sıra geldi flutter ile bu yapacağımız işlemleri yapmakta.

  • İlk olarak bir “build.yaml” dosyası açıp bunu tanımlamamız gerekiyor. Bu dosya, dosya yolumuzun en üstünde tanımlanmalıdır.(pubspec.yaml ile aynı yerde olmalıdır.)
  • Şimdi ise uygulamanınız başlarken bir yükleme(init) kodu yazmamız gerekiyor.

Buradaki “initializeReflectable()” tanımlaması bize bir sonraki adım sonucunda dinamik bir şekilde oluşacaktır.

  • Yapmak zorunda olduğumuz işimizin bir adımı daha vardır. Bu da önemli bir yol tanımlamalarımızı yaptıktan sonra terminal üzerinden bu satırı çalıştırmak ve bizim reflection olarak işaretlediğimiz sınıfın oluşması için gereken adımı tamamlamış olmaktır..

flutter packages pub run build_runner build

Bu adımdaki işlem build.yaml dosyamızında bize yön göstermesi ile lib/main.dart dosyası ile aynı yerde main.reflectable.dart dosyası oluşturacaktır. Bundan sonraki adımlarda yeni geliştirmelerimiz için şu komutu çalıştırarak main.reflectable.dart sınıfınızı güncellemiş olursunuz.

pub run build_runner build DIR

Ç ok önemli bir nokta daha var: Sizin tanımlamış olduğunuz model sınıflarınızın oluşabilmesi için bunları kullanıyor olmanız lazım. Yani bir yerden bunları daha önceden çağırmış olmanız gerekmekte. Aksi taktirde modeliniz oluşmayacaktır. Bunu biraz denedikten sonra siz de fark edeceksiniz. Oluşan modelinizin gerçekten oluştuğunu anlamak için main.reflectable.dart ‘da izinin olmuş olmasına dikkat etmelisiniz.

  • Kendi sayfamıza geçicek olur isek iki adet metod tanımlıyoruz. Her ikiside dinamik bir tip alacak ve buna göre bizim istediğimiz işlemleri yapıp ekrana bu değerleri işleyip değiştirecek.

Her iki örnek aslında aynı işi yapmakta fakat burada güzel olan adımlar mevcut. Birinde nesneye boş kurucu metod sayesinde direk erişirken diğerinde ise aşırı yükleme ile hazırladığımız diğer metodu tetikletiyor ve gelen değeri ekranımızdaki değere eşitliyoruz.

Github’daki projede kafamdaki ağ istekleri için yaptığım örnek mevcut. İncelerken sizin features/hello dosyasına bakmanız yeterli olacaktır. Bu projeyi “features base” bir yapı ile kurgulayıp ekranlarımı temiz ve ayrı yapmayı hedefliyorum.

Veeee 🎉 İlk aşamayı tamamladık. Burada çok basit bir senaryo ile bir sonrakilerin alt yapısını hazırlamaya çalıştım. Devamında sizlerle kafamdaki ağ istekleri için olan projemi geliştirmeye devam edeceğim. Sevgilerimle iyi çalışmalar, kolay gelsin herkese 🥰👊

Github: https://github.com/VB10/flutter-reflect

--

--

Veli Bacık
KoçSistem

We always change the world, so just want it. [OLD]Google Developer Expert Flutter & Dart, Gamer, Work More!