Dart, Google tarafından geliştirilen açık kaynaklı bir programlama dilidir. Dart, sade ve anlaşılır söz dizimi ile dikkat çeker. Aynı zamanda, güvenilir ve hızlı uygulama geliştirme imkanı sağlar. Dart dilinin özellikleri arasında değişken tanımlama, koleksiyonlar, fonksiyonlar ve sınıflar gibi konular vardır.
Dart dilinde değişkenler, int, double, bool, String, List, Set, Map gibi farklı veri tiplerinde tanımlanabilir. Koleksiyonlar arasında List, Set ve Map yer alır ve bu koleksiyon tipleri, veri işlemlerini kolaylaştırır. Aynı şekilde fonksiyonlar da, tekrar eden işlemleri kolayca yapabilmesi için kullanılır.
Dart dilinde sınıflar ve nesneler, obje yönelimli programlamada kullanılır. Sınıflar arasında getter ve setter metotları, miras alma (inheritance) ve mixinler gibi özellikler bulunur. Bu özellikler de, kod tekrarını önleyerek daha düzenli ve anlaşılır bir kod yazımı sağlar.
Değişken Tanımlama
Dart dilinde değişkenler, veri tiplerine göre ayrılmaktadır. Değişkenler, var ve final/const anahtar kelimeleri ile tanımlanabilir. Var anahtar kelimesi ile tanımlanan değişkenler, ilk değer ataması yapıldığında değişken tipi belirlenirken; final/const anahtar kelimeleri ile tanımlanan değişkenlerde ise değişken tipi, değişken tanımında belirlenir. Aşağıdaki tablo, dart dilinde kullanabileceğiniz veri tiplerini göstermektedir.
Veri Tipi | Açıklama |
---|---|
int | Tam sayı |
double | Ondalıklı sayı |
bool | Mantıksal veri |
String | Karakter dizisi |
Aşağıdaki örnek kod, dart dilinde değişken tanımlama örneği göstermektedir:
var sayi = 5; // sayi değişkeni int tipinde tanımlandı ve 5 değeri ile ilk değer ataması yapıldı. final isim = 'Ali'; // isim değişkeni String tipinde tanımlandı ve 'Ali' değeri ile ilk değer ataması yapıldı. isim değişkeni final tipinde tanımlandığı için daha sonra başka bir değer atanamaz. const piSayisi = 3.14; // piSayisi değişkeni double tipinde tanımlandı ve 3.14 değeri ile ilk değer ataması yapıldı. piSayisi değişkeni const tipinde tanımlandığı için daha sonra başka bir değer atanamaz.
Koleksiyonlar
Dart dilinde ‘List’, ‘Set’ ve ‘Map’ koleksiyon tipleri bulunur. Bu koleksiyon tipleri, birden çok değeri saklamak için kullanılır.
List: List, sıralı bir koleksiyondur ve birden fazla öğeyi saklayabilir. Listenin her elemanı, indeks numarası ile erişilebilir. Listenin elemanları, aynı tipte değerleri saklayabilir.
Set: Set, elemanları indeksle değil, benzersiz anahtarlarla saklayan bir koleksiyondur. Listenin aksine, Set’teki elemanlar, aynı veri tipinden olmayabilir.
Map: Map’te her öğe, bir anahtar-değer çiftidir. Anahtar-değer çiftleri, Map içinde sıralı bir şekilde saklanmaz. Anahtara göre arama yaparak, değerlerine erişilebilir.
Dart dilinde, bu koleksiyon tiplerine erişmek için, çeşitli nitelikler kullanılabilir. Bunlar arasında ‘add’ metoduyla öğe ekleme, ‘remove’ metoduyla öğe silme, ‘isEmpty’ metoduyla boş olup olmadığını kontrol etme ve ‘length’ niteliğiyle toplam öğe sayısını öğrenme gibi işlemler yer alır.
Liste Oluşturma
Dart dilinde listeler, 0’dan başlayan bir indeksle sıralı elemanları depolayan bir koleksiyon tipidir. Listeler, dinamik olarak boyutlandırılabilir ve birden fazla türdeki verileri içerebilir.
Liste oluşturmak için, ‘List’ anahtar kelimesini kullanarak yeni bir liste tanımlamalısınız. Listenin elemanları, köşeli parantezler içinde belirtilir. Aşağıdaki örnekte, bir ‘sayilar’ listesi oluşturulmuştur:
Kod | Açıklama |
List<int> sayilar = [1, 2, 3]; |
3 elemanlı bir ‘sayilar’ liste tanımlaması oluşturur. |
Listenin elemanlarına erişmek için, indeks numarasını kullanabilirsiniz. İndeksler, 0’dan başlayarak sıralıdır. Örneğin, ‘sayilar’ listesindeki 2’ye erişmek için şu şekilde yapabilirsiniz:
Kod | Açıklama |
var ikinciSayi = sayilar[1]; |
2. elemana(eğer varsa) erişmek için kullanılır. |
Listeler, mevcut elemanları üzerinde birçok işlem yapmanıza izin verir. Bunlar arasında eleman ekleme, eleman silme, eleman arama ve sıralama gibi işlemler bulunmaktadır.
Spread Operator
Spread Operator Nedir?
Dart dilinde, liste veya set içindeki elemanları ayırarak farklı şekilde kullanmamıza olanak sağlayan Spread Operator, üç noktalı bir yazım şekliyle ifade edilir. Spread operatorünün Türkçe karşılığı “yaymak” olarak çevrilebilir. Yani, bir listenin veya setin içindeki elemanlar tek tek ayırıp başka bir yerde kullanmamızı kolaylaştırır.
Spread Operator Nasıl Kullanılır?
Spread operatorü, bir listenin elemanlarını başka bir listenin içine eklemek veya set’i liste şekline dönüştürmek için kullanabiliriz. Ayrıca, bir listenin elemanlarını bir metoda argüman olarak vermek için de kullanabiliriz.
Örnek Kullanımlar
İşlem | Kod | Sonuç |
---|---|---|
Liste Birleştirme |
List |
[1, 2, 3, 4, 5, 6] |
Set’i Listeye Dönüştürme |
Set |
[1, 2, 3] |
Metoda Parametre Olarak Vermek |
someMethod(...list1); |
… |
for .. in döngüsü
for .. in döngüsü Dart dilinde, for döngüsünün yanı sıra kullanılan bir döngüdür. Bu döngü, üzerinde gezinilecek bir liste veya koleksiyon elemanları üzerinde oluşturulur.
Bu döngüde, liste elemanlarının değeri, her bir döngüde değişken olarak atanır ve döngü bu değişken üzerinden döner.
Örneğin;
Dil | Tür |
---|---|
Dart | Kullanılabilir |
Flutter | Mobil Uygulama |
Java | Genel Amaçlı |
Bu listede, her bir satırın dil ve tür bilgisi mevcuttur. For..in döngüsünü kullanarak, bu listedeki dillerin hepsini yazdırabiliriz.
- for (var listItem in liste) {“{ “
- print(listItem[“Dil”]);
- print(listItem[“Tür”]);
- “}”}
Bu örnek, for..in döngüsünün listeler üzerinde nasıl kullanıldığını göstermektedir.
Set Oluşturma
Dart programlama dilinde Set koleksiyonu, benzersiz öğelerden oluşan öğeler listesi olarak ayarlanır. Bu koleksiyon, tekrarlayan değerlerin önlenmesi gereken durumlarda kullanılır. Set koleksiyonu, bir dizi element ile oluşturulur ve süslü parantezler kullanarak tanımlanır. Aşağıdaki örnekte, Set tanımı ve kullanımı yer almaktadır:
Setisimler = {'Ali', 'Veli', 'Ayşe'};print(isimler); // çıktı: {Ali, Veli, Ayşe}
Yukarıdaki örnekte Set koleksiyonu isimler oluşturulmuştur. Set koleksiyonu, ‘String’ veri tipine sahip ‘Ali’, ‘Veli’ ve ‘Ayşe’ elemanlarını içermektedir. Değerler arasında virgül kullanılır ve süslü parantezler içinde yer alır.
Ayrıca, Set koleksiyonuna boş bir Set atanabilir. Aşağıdaki örnekte boş bir Set koleksiyonu yer almaktadır:
Setbos = Set ();print(bos); // çıktı: {}
Bir Set koleksiyonundaki elemanlar, elemanlar arasındaki ilişkiyi belirlemek için ‘==’ operatörü kullanılarak karşılaştırılabilir. Karşılaştırma sonuçları ‘true’ veya ‘false’ şeklinde olacaktır. Ayrıca Set koleksiyonundan eleman çıkarmak için remove () veya clear () yöntemleri kullanılabilir.
Map Oluşturma
Dart dilinde Map, anahtar/değer çiftleri içeren bir koleksiyon türüdür. Bir anahtar, bir değeri ilişkilendiren bir yapıdır. Map değişkenleri oluşturmak için iki farklı yöntem vardır.
Birinci yöntemde, Map {}. öğeleri kullanılarak oluşturulabilir. Örneğin:
Mapyaslar = {"Ali": 25, "Veli": 30, "Ayşe": 28};
Yukarıdaki örnekte, String türünden anahtarlar ve int türünden değerler kullanılarak yaslar Map değişkeni tanımlanmıştır.
İkinci yöntem, Map() yapıcısını kullanmaktır. Örneğin:
var yaslar = new Map();yaslar["Ali"] = 25;yaslar["Veli"] = 30;yaslar["Ayşe"] = 28;
Yukarıdaki örnekte, new Map() yapıcısı kullanılarak yaslar Map değişkeni tanımlanmıştır. Daha sonra, [] belirleyicisi kullanılarak her bir anahtar/değer çifti eklendi.
Map’lerin içerdiği verilerin erişimi için kullanılabilecek birçok yöntem vardır, bununla birlikte, [] belirleyicisini kullanarak doğrudan anahtar değerleri atamak en sık kullanılan yöntemdir.
Fonksiyonlar
Dart dilinde fonksiyonlar, belirli bir amaç için tasarlanmış bir dizi komut seti olarak tanımlanabilir. Herhangi bir fonksiyon tanımlaması, fonksiyon adı, parametre listesi ve fonksiyonun geri döndürdüğü veri tipiyle birlikte yapılmaktadır. Fonksiyonların tanımlandığı yer, ana fonksiyon bloğunun dışında yer almaktadır.
Örnek olarak, bir toplama fonksiyonu tanımlayan kod:
Dart | JavaScript |
---|---|
int topla(int a, int b) { return a + b;} |
function topla(a, b) { return a + b;} |
Fonksiyonlar Dart dilinde birinci sınıf nesnelerdir, yani fonksiyonlar diğer fonksiyonlardan geri dönülebilir ve fonksiyonlar argüman olarak diğer fonksiyonlara geçirilebilir. Ayrıca, Dart dilinde anonim fonksiyonlar ve Higher-Order fonksiyonlar kullanımı oldukça yaygındır.
- Dart dilindeki fonksiyonlar isimlendirilmiş olabilir ve daha sonra çağrılabilir. İsimlendirilmiş fonksiyonlar, fonksiyonları tanımlamak ve anlamak için oldukça kullanışlıdır.
- Dart dilindeki anonim fonksiyonlar, isimlendirilmiş fonksiyonlar kadar kullanışlıdır ve genellikle isimlendirme gerektirmeyen kısa kod parçacıkları için kullanılır.
- Higher-Order fonksiyonlar, fonksiyonları parametre olarak alan ve/veya fonksiyonları geri döndüren, diğer fonksiyonlardır. Bu tür fonksiyonlar, Dart dilindeki diğer özelliklerle birleştirilerek oldukça güçlü bir programlama aracı haline gelirler.
İsimlendirilmiş Fonksiyonlar
Dart programlama dilinde, fonksiyonlar isimlendirmeleriyle çağrılabildiği gibi anonim şekilde de kullanılabilir. İsimlendirilmiş fonksiyonlar, belirli bir isimle tanımlanarak daha sonrasında kullanılmak üzere saklanır. Bu fonksiyonlar, bir sınıfın içinde tanımlanabilirler ya da direkt olarak dosya içinde fonksiyon olarak tanımlanabilirler.
Dart dilinde isimlendirilmiş fonksiyonlar, fonksiyon tanımlarken “fonksiyon_adı()” şeklinde tanımlanır. İsimlendirilmiş fonksiyonlar, diğer fonksiyonlar gibi değiştirilebilir, başka bir fonksiyonda kullanılabilir, fonksiyonlara parametre olarak aktarılabilir vb. gibi özellikleri vardır.
Örnek Kod | Açıklama |
---|---|
String isimlendirilmisFonksiyon() { return “Bu bir isimlendirilmiş fonksiyondur.”; } | Bir isimlendirilmiş fonksiyon örneği. Fonksiyonun adı “isimlendirilmisFonksiyon” olup, bir metin döndürmektedir. |
- İsimlendirilmiş fonksiyonların en büyük avantajı, isimleri sayesinde daha anlaşılır bir kod yazmayı sağlamasıdır.
- Bu fonksiyonlar daha çok tekrarlanan işlemleri tek bir fonksiyonda toplayarak kodun daha okunaklı hale gelmesini sağlar.
- Ayrıca isimlendirilmiş fonksiyonlar, algoritmanın daha iyi belgelenmesini sağlar. Bir işlemin adını vermek, o işlemin ne yaptığı hakkında bilgi sahibi olmak anlamına gelir.
İsimlendirilmiş fonksiyonların kullanımı, Dart dilindeki fonksiyonlar arasında en yaygın kullanılanlarından biridir. Özellikle büyük projelerde kullanılması, kodun ve algoritmanın daha iyi organize edilmesine olanak tanır.
Anonim Fonksiyonlar
Dart dilinde anonim fonksiyonlar, isim veya parametre listesi olmadan tanımlanabilen fonksiyonlardır. Anonim fonksiyonlar, genellikle daha kısa ve işlevsel olduğu için kodda sık sık kullanılır.
Anonim fonksiyonlar, ayrıca bir değişkene atanarak daha sonra kullanılabilir veya başka bir fonksiyona parametre olarak geçirilebilir. Aşağıdaki örnekte gösterildiği gibi lambda ifadesi kullanılarak anonim fonksiyon tanımlanabilir:
“`dart(void printNumber(int number){ print(number);})(12);“`
Yukarıdaki kod, fonksiyonun tanımlanmasını ve parametre olarak geçilmesini aynı anda gerçekleştirir.
Anonim fonksiyonlar, aynı zamanda higher-order fonksiyonlarla birlikte çalışarak çok güçlü bir etki yaratabilir. Örneğin, aşağıdaki örnek gösterildiği gibi, higher-order fonksiyon olan map(), bir liste ve anonim fonksiyon kullanarak listenin elemanlarını değiştirebilir:
“`dartvar liste = [1, 2, 3];var yeniListe = liste.map((item) => item * 2).toList();“`
Yukarıdaki örnek, liste değişkenindeki elemanları iki katına çıkarır ve sonra bu yeni elemanlar yeniListe değişkeninde saklanır.
Anonim fonksiyonlar, kodda daha az yazım yapılabileceği, daha basit ve hızlı bir kod yazma süreci sağladığı için dart dilinde çok faydalıdır.
Higher-Order Functions
Dart dilinin bir diğer özelliği de Higher-Order fonksiyonlarıdır. Higher-Order fonksiyonlar, diğer fonksiyonları parametre olarak alabilen veya fonksiyon döndürebilen fonksiyonlardır. Bu özellik, kodun okunabilirliğini artırır ve tekrarlanan kod bloklarının önüne geçer.
Bir fonksiyon argüman olarak başka bir fonksiyon alabilir. Örneğin, filtreleme fonksiyonu gibi. Higher-order fonksiyonlar, ayrıca bir fonksiyonu geri döndürebilirler. Örneğin, bir toplama fonksiyonu oluşturup, başka bir fonksiyona parametre olarak aktarılabilir.
Dart dilinin higher-order fonksiyonları, fonksiyonların güçlü bir şekilde bileşen (component) olarak kullanılmasına olanak sağlar. Örneğin, haritalama işlemi için kullanılabilir. Haritalama, bir fonksiyonu listenin tüm elemanlarına uygulayarak yeni bir liste oluşturur.
Sınıflar ve Nesneler
Dart dilinde sınıf tanımlama, nesne oluşturma ve sınıf üyelerine erişim esas olarak C++ veya Java gibi nesneye dayalı programlama dilleri ile aynıdır. Sınıflar kullanılara modüler ve yeniden kullanılabilir kod yazma olanağı sağlar.
Sınıf tanımlamak için class anahtar kelimesi kullanılır. Nesne oluşturmak için new anahtar kelimesi kullanılabilir.
Sınıf üyeleri fields (değişkenler), methods (fonksiyonlar) ve constructors (yapıcılar) şeklinde tanımlanabilir. Dart dilinde inheritance (miras alma) ve mixin kullanımı gibi gelişmiş nesneye dayalı programlama özellikleri vardır.
Syntax | Açıklama |
---|---|
class className { fields methods } |
Dart dilinde sınıf tanımlama yapısı |
className objectName = new className(); | Yeni bir nesne oluşturma yapısı |
className objectName = className(); | Yeni bir nesne oluşturma yapısı (kısaltma) |
Dart dilinde sınıf ve nesne tanımlama ve kullanımı oldukça kolay ve esnektir. Siz de nesneye dayalı programlama prensiplerini kullanarak modüler ve yeniden kullanılabilir kod yazabilirsiniz.
Getter ve Setter
Dart dilinde sınıfların kullanımı için Getter ve Setter metodları oldukça önemlidir. Getter metodları, sınıfın özelliklerinin okunabilmesine olanak sağlar. Setter metodları ise sınıftaki özelliklerin değiştirilmesine izin verir.
Örnek vermek gerekirse, bir kullanıcının adını ve soyadını içeren bir sınıf tanımlayalım:
Class | Kullanici |
---|---|
String _ad | |
String _soyad |
Yukarıdaki kodda “_ad” ve “_soyad” değişkenleri private olarak tanımlanmıştır. Getter ve Setter metodları ile bu değişkenlere erişilebilir ve değiştirilebilir.
- Getter ve Setter metodlarının sınıf içinde tanımlanması aşağıdaki şekildedir:
class Kullanici { String _ad; String _soyad; String get ad => _ad; set ad(String value) => _ad = value; String get soyad => _soyad; set soyad(String value) => _soyad = value;}
Yukarıdaki örnekte, “get” ve “set” blokları “_ad” ve “_soyad” değişkenleri için ayrı ayrı tanımlanmıştır. Bu sayede değişkenlerin okunması ve değiştirilmesi sağlanır.
Getter ve Setter metodları sınıf içinde değişkenlerin daha güvenli bir şekilde kullanılmasına olanak sağlar. Değişkenlerin istenmeyen bir şekilde değiştirilmesi veya okunması engellenir. Bununla birlikte, bu metodlar gereksiz olabilir ve sınıfın boyutunu artırabilir. Yani, kullanımı ihtiyaçlarına göre belirlenmelidir.
Inheritance
Dart dilinde miras alma (inheritance) kavramı, bir sınıfın başka bir sınıftan özelliklerini ve metotlarını miras alması anlamına gelir. Bu özellik, tasarımın daha modüler ve ölçeklenebilir hale gelmesine yardımcı olur. Miras alınan sınıf, üst sınıf olarak da bilinir ve miras alan sınıf alt sınıf olarak adlandırılır.
Alt sınıf, üst sınıftaki metot ve özelliklere erişebileceği gibi, bu metotları ve özellikleri değiştirebilir ve genişletebilir. Bu sayede, benzer özellikleri olan nesneler için kod tekrarını önlemek mümkün hale gelir. Örneğin, bir Araba sınıfı oluşturulduktan sonra, tüm arabaların ortak özellikleri ve metotları belirtilebilir. Daha sonra, bu Araba sınıfından türetilen başka sınıflar oluşturulabilir, örneğin; sedan, spor arabalar veya kamyonlar.
Dart dilinde miras alma işlemi, ‘extends’ anahtar kelimesi kullanılarak gerçekleştirilir. Örneğin; “class Sedan extends Araba {}” şeklinde bir sınıf tanımlanırken, Sedan sınıfı Araba sınıfından özellikler ve metotlar miras alır.
Bu şekilde, bir sınıfın hazır özelliklerinin yeniden kullanımı kolaylaşırken, kod tekrarından da kaçınılmış olur. Inheritance kullanımı, Java, C++, Python gibi diğer dillerde de sıkça kullanılır.
Mixinler
Mixinler, Dart dilinde bir sınıfa başka bir sınıfın özelliklerini eklemek için kullanılan bir mekanizmadır. Mixinler, öncelikle bir sınıfın özelliklerini tekrar kullanımını sağlar ve böylece kodun tekrarlamasını önler. Mixinler, bir sınıf tarafından kalıtım (inheritance) alınan değil, birleştirildiği (merge) sınıfa uygulanır.
Mixinler, sınıfların davranışlarını genişletmek için kullanılır ve özellikle birden fazla sınıfta kullanılması gereken davranışlar için oldukça faydalıdır. Mixinleri kullanırken öncelikle mixin sınıfını tanımlamalı ve ardından bir sınıfın içinde mixin olarak kullanmalısınız.
Mixinler aynı zamanda, dart dilindeki arayüz (interface) kavramının uygulanmasında da kullanılır. Eğer bir sınıfın birden fazla arayüzü uygulaması gerekiyorsa, mixinler bu durumda da oldukça faydalıdır.
Flutter, Google tarafından oluşturulan bir açık kaynaklı framework’tür ve iOS ve Android gibi mobil platformlar için uygulama geliştirme işlemlerini kolaylaştırır. Bu framework, kullanımı kolay araçlar ve hazır widget’lar ile geliştirme sürecini hızlandırır. Ayrıca, hoş bir kullanıcı arayüzü oluşturmak için birden çok tasarım aracı sunar.
Flutter’da, stateless ve stateful widget’lar gibi temel kavramlar vardır. Stateless widget’lar, değişmeyen ve sabit bir görünüme sahip widget’lar iken, stateful widget’lar, kullanıcının etkileşimleri gibi farklı birçok faktöre bağlı olarak değişen bir widget’tır. Bu kavramları kullanarak temel bir uygulama oluşturabilirsiniz.
Flutter, sayfa geçişleri (navigation) için Navigator widget’ını kullanır. Bu widget, kullanıcının bir sayfadan diğerine geçiş yapmasına izin verir. Ayrıca, uygulama içindeki sayfa geçişlerini yönetmek için routing konseptini kullanabilirsiniz.
Flutter, aynı zamanda asenkronik programlama için yapılacak işlemleri bloke etmeden fonksiyonların geri dönüş değerlerini elde etmek için Future, async ve await kavramlarını kullanır. Ayrıca, API’lerin kullanımı için Http paketi mevcuttur. Flutter, uygulamalarınızda yerel veritabanı kullanımını da sağlar. Bu amaçla, Sqflite paketi kullanılabilir.
Widgets ve Layouts
Dart dilinde widgetler, kullanıcı arayüzünü oluşturan birimlerdir. Flutter, birçok çeşit widget sunar. Bu çeşitler arasında Stateless Widget ve Stateful Widget gibi widgetler, sırasıyla sabit ve değişken durum tutabilen widgetlerdir.
Flutter, widgetlerin kullanıldığı Layout konusunda da geniş bir yelpazede seçenekler sunar. Row ve Column gibi widgetler ile dikey ve yatay hizalamalar sağlanabilir. Ayrıca Container Widget’i, içindeki diğer widgetlerin düzenlemesinde esneklik sağlar.
Diğer layout widgetleri arasında, flex layout kontrolü sunan Flexible ve Expanded widgetler de bulunur. Flutter bu widgetleri sunarak kolayca adapte edilebilir, mobil uyumlu bir kullanıcı arayüzü sağlar.
Stateless Widget
Stateless widget, Flutter uygulamalarında sıklıkla kullanılan bir widget türüdür. Bu widget türü, statik veya değişken olmayan içerikleri görüntülemek için kullanılır. Yani, widget özellikleri değişmeden sabit kalır ve herhangi bir durum bilgisi taşımaz.
Bu widget türü, uygulamanın performansını artırır çünkü değişmeyen bir yapıda olduğu için render işlemi daha hızlı gerçekleşir. Ayrıca, stateless widget uygulamanın güvenliği için daha iyi bir seçenektir çünkü herhangi bir durum bilgisi taşımaz.
Bir stateless widget oluşturmak çok kolaydır. Sadece StatelessWidget sınıfını genişleterek yeni bir widget oluşturun. Bu widgetler genellikle build() metodunu kullanarak ekrana çıktı verir. Stateless widgetler, değişkenleri barındıramadıkları için, widget yeniden oluşturulmadan önce initState() veya setState() metodunun kullanımı gereksizdir.
Özetle, stateless widget, sabit kalması gereken ve değişmez özellikleri olan widgetler için tercih edilen bir seçenektir. Performansı artırır ve uygulama güvenliği için daha iyi bir seçenektir. Stateless widgetler, kolayca oluşturulup kullanılabildiği için, Flutter’da en sık kullanılan widget türlerinden biridir.
Stateful Widget
Dart dilinde kullanılan Stateful Widget, uygulamalarda değiştirilebilir ve dinamik özelliklere sahip olan widgetler için kullanılır. Bir örnekle açıklamak gerekirse, bir butonun tıklanma sayısını sayan bir uygulama yazmak istediğimizi düşünelim. Burada butonun anlık sayısını takip etmek ve göstermek için Stateful Widget kullanmamız gerekir. Stateful Widget, tıklama sayısı ve diğer dinamik özellikler gibi özelliklerin tutulduğu state özelliğine sahip olan widgetlerdir.
Bir Stateful Widget oluşturmak için iki ayrı sınıf kullanılır: StatefulWidget ve State sınıfı. StatefulWidget, uygulama başına tek bir instance oluşturulur ve build() yöntemiyle görüntülenir. State sınıfı, StatefulWidget ile oluşturulan instance’ın state özelliğini tutar ve değiştirilebilir özelliklerin set edilmesini sağlar.
- StatefulWidget sınıfından türetilen sınıf oluşturulur.
- Oluşturulan sınıfın createState() yöntemi çağrılır. Bu metot, State nesnesinin oluşturulmasından sorumludur.
- State sınıfından türetilen sınıf oluşturulur ve createState () yöntemi sonucunda State nesnesi oluşturulur.
- Widget’taki durum değiştiğinde, setState() yöntemi çağrılarak State nesnesi güncellenir ve build () yöntemi çağrılır.
Yukarıdaki adımların tamamlanmasının ardından, artık Stateful Widget kullanan dinamik özellikli bir widgetimiz vardır.
Layout Widgetler
Flutter, layout widgetlerini düzenlemek için birçok farklı seçenek sunar. Bu widgetler, arayüzdeki öğeleri istenilen şekilde yerleştirmek için kullanılır. Bu widgetlerin bazıları aşağıdaki gibidir:
- Container: Boyutlarını, arkaplanlarını, kenar boşluklarını, doldurma değerlerini ve çerçevelerini belirlemek için kullanılır.
- Row ve Column: Elemanları yatay ve dikey olarak sıralamak için kullanılır.
- Expanded: Çocuklarının mümkün olan en fazla alanı kaplamasına izin veren bir widgettir.
- Stack: Çocuklarını üst üste yerleştirir, z-eksenleriyle yönetilir.
- Wrap: Sınırlı bir alan içerisinde elemanları sıralamak için kullanılır. Elemanlar, belirtilen sınıra ulaşıldığında bir alt satıra geçer.
Bu widgetlerin değerleri, genelde child ve children gibi özellikler vasıtasıyla ayarlanır. Örneğin, Row widgeti için children özellikleri belirleyerek yatay bir sıra oluşturulabilir. Bu widgetler ile birlikte kullanılabilecek kaynaklardan bazıları ise Padding, FractionallySizedBox, SizedBox ve ListView widgetleridir.
Navigation
Flutter’da sıkça kullanılan bir konsept olan navigasyon, sayfalar arasında geçiş yapmamızı sağlıyor. Bu işlemi yaparken ilerlemek istediğimiz sayfayı Navigator widgeti ile push() metodunu kullanarak ekliyoruz. Bu şekilde, geri tuşuna basarak önceki sayfaya dönebiliyoruz. Routing ise navigasyonun bir diğer önemli kısmıdır. Uygulamamızdaki her sayfayı route’lar arasında ilişkilendiren bu kavram ile sayfalar arasında geçiş yapabiliyoruz.
Flutter’da Navigation yapmak için Navigator.push() fonksiyonunu kullanabiliriz. Bu yöntem sayesinde, var olan sayfadan yeni sayfaya geçiş yapabiliriz. Örneğin, ana sayfamızda bir butonumuz var. Bu butonu tıkladığımızda, başka bir sayfaya yönleneceğiz. Widgetler arası geçiş yaparken “Navigator.push()” kullanılabilir. Böylece, bir widgeti diğerine yönlendirebiliriz. Bu sayede, önceki sayfaya “geri” butonu ile tekrar dönebiliriz.
Bir Cevap Yaz