BİL209U-MOBİL UYGULAMA GELİŞTİRME
Ünite 5: Dart ile Kodlama
Giriş
Derste Dart programlama dilinin temel özellikleri ve fonksiyonları anlatılmaktadır. Bununla beraber dilin temel mekanizmaları ve veri yapıları tanıtılması ve nesne yönelimli programlama tekniklerinin açıklanması hedeflenmektedir.
Dart Kavramı
Dart, farklı platformlarda çalışabilen istemci uygulamaları oluşturmak için kullanılabilen bir programlama dilidir. Her türlü platforma uygun kodlama yapmaya olanak tanır. Dart uygulamaları rakip platformlara göre oldukça hızlı çalışmaktadır.
Dart nesneye yönelimli ve bildirimsel bir dildir. Dart programcıları, arayüzlerin farklı veri yapılarına göre nasıl davranacağını belirler. Veri yapısı değiştiğinde, gerekli değişiklikler Dart'ın arayüzüne yansıtılır. Öte yandan yinelemeli diller, programcının veri yapılarındaki değişiklikleri dinlemesini ve gerektiğinde arayüze müdahale etmesini gerektirir. Bu nedenle, kodunuzdaki değişkenlere aktarılabilecek veri türlerini (int, string vb.) değiştiremezsiniz. Ancak Dart kodunuzdaki bir değişken, tanımlı veri türünden farklı bir değerle karşılaşırsa derleme sırasında bu durum yakalanacak ve hata ayıklama yapılması gerekecektir. Bu mekanizma sayesinde, programcıların değişken türleri belirtmesi gerekmez. Dart, yapılan atamalara göre bir değişkenin veri türünü belirleyebilir. Dart null-güvenliği sunarak değer atanmamış değişkenlerin kullanılmasında çıkacak sorunları da engeller.
Dart Uygulamaları
Bu bölümde Dart mantığı farklı örnek kodlar vasıtasıyla pekiştirilmektedir. Dart dili kütüphane tabanlı geliştirmeye olanak sağlar. Kütüphaneler import anahtar sözcüğüyle eklenir. Böylece kütüphane içindeki tüm kodlar programa dahil edilir. dart:math bu kütüphanelere örnek olup matematik fonksiyonlarını içerir.
Dartpad bir IDE ortamı olup Dart uygulama geliştirmeyi kolaylaştırmaktadır. Bu ortamda yazılan kodlar derlenip sonuç kolaylıkla elde edilmekte ve kodlayıcıya sunulmaktadır. main bir dart uygulamasının ilk çalıştırılacak fonksiyonudur. Bununla birlikte öğrenilecek temel kavramlar print, String, num, int ve fonksiyon yaratma ile ilk Dart kodları oluşturulacaktır. Fonksiyonlarda parametre atandığında çağrılacak fonksiyonun aynı sayıda ve tipte parametre ile kullanılması gerekmektedir.
Dart Dili
Bu bölümde Dart ile programlamanın temel yardımcılarına değinilmektedir.
İşleçler (Operatörler)
Aşağıda temel işleçler ele alınmıştır.
Aritmetik İşleçler
Aritmetik işleçler toplama, çıkarma, çarpma, bölme ve mod alma gibi işlemleri gerçekleştirmek için kullanılır. Her komut sonu “;” ifadesiyle belirlenir ve açıklama eklemek için de // ifadesinden yararlanılır.
Ön Ek ve Son Ek ve Birleşik Atama İşleçleri
Ön ek ve son ek arttırma/azaltma işleçleri uzun işlemlerin kısayoldan ifade edilmesi için kullanılır. Birleşik atama işleçleri ise değişken üzerinde bir sayı arttırma ve azaltma dışında gerçekleştirilecek işlemlerin kısaca ifade edilmesi için kullanılır.
İlişkisel İşleçler
İlişkisel işleçler verilen büyüklük, küçüklük ya da eşitlik durumlarının kontrol edilmesi için kullanılır ve sonucunda bir Boolean (true/false) döndürür.
Mantıksal İşleçler
Boolean veri tipindeki true ve false değerleri üzerinde işlem yapabilmek için mantıksal işleçler kullanılır.
Durumsal Atama
Dart tek satırlık durumsal atama işlecini destekler. Bu yapı basit bir if-else bloğuna benzer. Fakat küme parantezleri ve atama satırlarını gerektirmediğinden, çok daha kısa bir yoldur.
Değişkenler
Programlar bellek içerisinde saklanmaktadır. Burada belleğin belli noktalarından değişken saklamak için de yararlanılır. Bellek içeriği atama işlemi ile değiştirilir. Temel veri tipleri: int, double sayısal değerleri saklamak için kullanılır. String UTF-a6 standardında karakter dizileri için kullanılır. Bool is mantıksal değer değişkenleri için kullanılır. Eğer veri tipine başta karar verilemezse var kullanılabilir.
Listeler (List)
Listeler Dart dilinde aynı veri tipinden birden fazla değişkenin indis sayısıyla erişimi için kullanılan değişken dizileri için kullanılır. Değişkenler dinamik olup bazı liste metodları aşağıda verilmiştir.
add: Listelere ekleme yapılabilmektedir.
removeAt: Indis ile listeden silme işlemi yapılabilmektedir.
forEach: Ardışık liste elemanları ile işlem yapılır.
indexWhere: Listede arama yapmayı sağlar
Haritalar (Map)
Haritalar, anahtar ile değer çiftlerinden oluşan kümelerdir. Her bir eşsiz anahtar için bir değer tanımlanır. Değerler aynı veya farklı olabildiği gibi anahtar ve değerlerin tipleri de değişiklik gösterebilir. Boş harita değişkeni, Map ve ardından konulan <> karakterler arasına yazılan veri tipleri ile yaratılır. Haritalar için kullanılacak metotlardan bazıları:
forEach: Haritalardaki tüm değerlerin taranması için kullanılabilir.
keys ve values: Haritadaki anahtarlar ve değerlerin listelerine erişilebilir.
Akış Yöneticiler
if-else Yapıları
Uygulama akışı sırasında koşullu yönlendirmeler için kullanılır. if bloğu koşulun doğru olduğu else bloğu ise yanlış olduğu seçenekte çalıştırılır.
switch-case Yapıları
Birden fazla koşulun olduğu durumlarda kullanılır. Değişkenin alabileceği her değer için bir case alanı açılarak bu alan içinde gerekli düzenlemeler yapılır.
for Döngüleri
Bir kod bloğunu belirli bir sayıda ve yinelenen biçimde çalıştırmak için kullanılan bir döngüdür.
while Döngüleri
Önceden belirlenmiş bir koşul bozulana kadar kod bloğunun çalıştırılmasını sağlar
Fonksiyonlar
Sıklıkla yinelenen kod blokları için fonksiyon tanımlanabilir. Fonksiyonlar bir değer döndürebildiği gibi void anahtarıyla bir değer döndürmeden de işletilebilir. Sadece bir ad kullanılarak fonksiyon tanımlanır ve bu tanımlanmış adla da fonksiyon, program içerisinden çağrılır.
Değişkenlerin Etki Alanları
Değişkenlerin etki alanları (lexical scope) küme parantezi (“{}”) içerisinde belirlenmiş değişkenlere uygun olarak sadece tanımlandığı alanda geçerli kılınabilir. Bu alan dışından erişim bir hata üretecektir. Özellikle fonksiyonlarda bu etki alanlarını tanımlşamak kod bütünlüğü açısından yararlı olabilmektedir.
Dart ile Nesneye Yönelik Programlama
Dart nesne tabanlı bir dil olup sınıflar class deyimi ile tanımlanır. Sınıflar kendi içlerinde metotları ve değerleri tutabilmekte ve bu sınıflardan türetilen nesnelere otomatik olarak bu değerler ve metotlar varsayılan olarak tanımlanabilecektir. Her nesne tanımlı program yapısında olduğu gibi kalıtım (inheritance) mekanizması yoluyla bir sınıf, daha önce yazılmış bir sınıfın kodlarını miras alabilir. Kalıtım yoluyla miras işlemi için extends ifadesi kullanılmaktadır.
Çok Sayfalı Uygulamalar
Mobil uygulamalar genelde birden fazla sayfaya sahip olup bu sayfaların birbirleriyle ilişkilendirilmesiyle kullanıcıya esneklik ve kolaylık sağlanmaktadır. Flutter uygulamalarının kullanıcı arayüzleri bileşenler (widget) ile kurgulanır. Scaffold bileşenleri sayfalardaki alt barlar, üstbarlar ve menülerin yerleştirilmesi için kullanılabilecek
slotlar sunar. Çoğu Flutter uygulamasının yerleşimi Scaffold bileşenleri ile düzenlenir.
Çok sayfalı program örneklerinin yaratılması için ana sayfadan sonra ulaşılacak sayfalar çekmece bileşeni olarak tanımlanır ve tüm bu işlemler bir ağaç yapısıyla bir araya getirilir. Flutter uygulamalarındaki sayfalara rota adı verilir. Navigator nesnesi sayfada tanımlı rotaların yığıldığı bir yapı sağlar. Her bir rota Navigator nesnesine eklenir ya da nesne üzerindeki yığından çıkarılır. Bu sayede rotalar arası gezinim sağlanmış olur.
Aşağıda bazı temel flutter bileşenleri tanımlanmıştır:
Başlangıç Sayfası
Flutter uygulamaları genellikle lib klasörü içindeki main.dart dosyası içinden başlatılır. Bu dosya içindeki main fonksiyonu uygulamanın başlangıç noktasıdır. routes ile uygulamada kullanılacak rotalar listelenir. initialRoute uygulamanın başlangıcındaki rotayı belirler. theme uygulamanın temasını belirler.
Giriş Sayfası
Uygulama başladığı anda gösterilecek ilk rota olan GirisSayfasi özünde bir Scaffold bileşenidir. Scaffold bileşenleri üst bar (appBar), alt bar (bottomNavigationBar), çekmece (drawer), eylem düğmesi (floatingActionButton) ve sayfa gövdesi (body) gibi temel arayüz bileşenlerinin yerleştirilmesi için slotlar sağlar.
Çekmece Sayfası
Tüm sayfalarda gösterilen Çekmece sayfası bir drawer nesnesidir. Tüm bu bileşenler Flutter’ın sağladığı zengin simge kütüphaneleri ile kullanıcıya kolaylık sağlanmaktadır. Kullanıcıların dokunabileceği menü satırları ise ListTile bileşenleri ile oluşturulmaktadır. Simge kütüphaneleri Icon sınıfı kullanılarak eklenebilir.
pubspec.yaml Dosyası
pubspec.yaml dosyası Flutter projelerine görseller, fontlar ya da ek kütüphaneler gibi dışarıdan eklenecek içeriklerin tanıtılması için kullanılır.