Discover millions of ebooks, audiobooks, and so much more with a free trial

Only $11.99/month after trial. Cancel anytime.

Flutter için Dart Programlama
Flutter için Dart Programlama
Flutter için Dart Programlama
Ebook365 pages2 hours

Flutter için Dart Programlama

Rating: 0 out of 5 stars

()

Read preview

About this ebook

Çarpıcı, platformlar arası uygulamalar oluşturmanıza yardımcı olacak örnekler, ayrıntılı talimatlar ve notlar içeren kapsamlı bir çalışma olan Flutter Dart ile mobil uygulama geliştirme dünyasını keşfedin. İster yeni başlayan ister deneyimli bir geliştirici olun, bu kitap Flutter ve Dart ile programlamanın temelleri ve ileri teknikleri konusunda size adım adım rehberlik etmek için tasarlanmıştır.

LanguageTürkçe
PublisherZeuz IT
Release dateMay 5, 2023
ISBN9798223077619
Flutter için Dart Programlama

Related to Flutter için Dart Programlama

Related ebooks

Reviews for Flutter için Dart Programlama

Rating: 0 out of 5 stars
0 ratings

0 ratings0 reviews

What did you think?

Tap to rate

Review must be at least 10 words

    Book preview

    Flutter için Dart Programlama - Zeuz IT

    Flutter için Dart Programlama

    Zeuz IT

    Published by Zeuz IT, 2023.

    While every precaution has been taken in the preparation of this book, the publisher assumes no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein.

    FLUTTER IÇIN DART PROGRAMLAMA

    First edition. May 5, 2023.

    Copyright © 2023 Zeuz IT.

    Written by Zeuz IT.

    İçerik tablosu

    Title Page

    Copyright Page

    Flutter için Dart Programlama

    Sign up for Zeuz IT's Mailing List

    ÖNSÖZ

    WHAT IS DART ?

    DART DİLİNİN ÖZELLİKLERİ

    Type Safety

    Static Type Checking Ve Dynamic (Runtime) Type Checking

    Type Inference(Tür Çıkarımı)

    Null Safety

    DART COMPİLERS

    DART SDK

    DART PROJE YAPISI

    DART PACKAGES

    Dart Libraries

    Dart Linting

    Tests

    JIT & AOT COMPİLER

    DART VM

    Jit Derleyicisi Kullanılarak Source Kodun Çalıştırılması

    Aot Derleyicisi Kullanılarak Source Kodun Çalıştırılması

    Kernel, JIT Ve AOT Snapshots

    Kernel Snapshots

    Jit Snapshots

    Aot Snapshots

    DART PAKETLERİ HAKKINDA HER ŞEY

    Pubspec.Yaml İçeriği

    Dependencies(Bağımlılıklar) Hakkında

    Hosted, Git, Path, Sdk İle Package Alma

    ‘Dart Pub ...’ Komutları

    EFFECTİVE DART & ANALYSİS OPTİONS DOSYASI

    Düzenli Ve Tutarlı Yazmak

    Minimalist Ve Anlaşılması Kolay Yazmak

    Her Kod Parçasını Test Etmek

    ANALYSİS OPTİONS DOSYASI

    NULL SAFETY

    Null Safety İle Gelen Özellikler Listesi

    Dart’s Type System Before And After Null Safety

    Null İle Karşılacağımız Diğer Durumlar

    Invalid Returns

    Uninitialized Variables

    İyileştirmeler

    Control Flow Analysis

    Reachability analysis

    Definite Assignment Analysis

    Nullable => Non-Nullable Çevrimi Ve Null Assertion Operator(!)

    Late Variables

    Late Modifier ile Lazy Initialization

    HIZLI ÖZET

    ANAHTAR KELİMELER

    Contextual Keywords

    Built-In Identifiers

    Asynchrony Support

    DART DEĞİŞKENLER(VARİABLES)

    Değişken Çeşitleri

    Değişken Tanımı Ve Kullanımı İle İlgili Kurallar

    Özet Tablo

    Var Keyword - Dynamic Veri Türü - Final Keyword - Const Keyword Arasındaki Fark

    Var Vs Dynamic

    Final Vs Const

    BUİLT-İN TYPES

    Numbers(Num, İnt, Double)

    Faydalı Metotlar(Parse(), .Tostring(), .Clamp(), .Ceil(), .Floor(), .Round())

    Strings

    Interpolation

    Booleans

    Lists

    List Oluşturup Değer Atamanın Yolları

    Dart Dilinde .(nokta) İçeren Operatörler

    Collection If Ve Collection For

    Not:

    Sets

    Maps

    Runes

    FONKSİYONLAR

    Anonymous Functions(Lambdas, Closures)

    Parameters

    Lexical Scope

    Lexical Closure

    Callable Class(Sınıfın Fonksiyon Gibi Çağrılması)

    OPERATORS

    Operators List

    Expressions(İfadeler)

    Arithmetic Operators

    Equality And Relational Operators(Eşitlik Ve İlişkisel Operatörler)

    Type Test Operators(As, İs, İs!)

    Assignment Operators(Atama Operatörleri)

    Logical Operators(Mantıksal Operatörler)

    Bit Operators(Bit Operatörleri)

    Conditional Operators(Koşullu Operatörler)

    CONTROL FLOW STATEMENTS

    İf/Else Statement

    For Loop Statement

    While, Do-While Loop Statement

    Break/Continue Statement

    Switch-Case Statement

    Assert Statements

    Exceptions(Try, Throw, Catch, Finally)

    DART CLASSES 1(SINIFLAR)

    İnheritance Giriş

    İnstance Variables, Methods

    İnstance Variables(Sınıf Değişkenleri, Alan Değişkenleri)

    Methods(Functions)

    initializer list

    Named Constructors

    Redirecting Constructors

    Factory Constructors

    Singleton Pattern With Factory Class

    Instance Methods

    Operators

    Getter - Setters

    Static Methods

    DART CLASSES 2(SINIFLAR)

    İnheritance Devam(Kalıtım)

    Polymorphism

    Covariant Keywords

    İnheritance Özet

    Abstraction

    Abstraction Özet

    Çoklu Kalıtım ve Deadly Diamond of Death Problemi

    MİXİNS

    Özet(Mixins)

    EXTENSİON METHODS

    GENERİCS

    Generic Türlerin İsimlendirme Kuralları

    Data Structure With Generic

    Generic Functions & Class Methods

    Özet(Generics)

    LİBRARİES & PRİVATE FİELDS

    1)Birden Fazla .Dart Dosyası İle Bir Kütüphane Oluşturulabilir Mi ?

    2)Bir Kütüphane Başka Kütüphaneler İçerebilir Mi ?

    TESTİNG

    SYNCHRONOUS AND ASYNCHRONOUS WORKFLOW

    Introduction

    Synchronously Workflow

    Iterables And Lists

    Asynchronously Workflow

    Future

    Streams

    ÖNSÖZ

    Dart programlama dili, Google tarafından geliştirilen açık kaynaklı bir dil olarak özellikle mobil uygulama geliştirme alanında popüler hale gelmiştir. Dart, kolay anlaşılabilir sentaksı, verimli performansı ve genişletilebilirdik özellikleriyle öne çıkmaktadır.

    Bu kitap, Dart programlama dilinin temel yapılarını öğrenmek isteyen herkes için kapsamlı bir kaynak olacaktır. Kitap, temel Dart konularına ve özelliklerine ayrıntılı bir şekilde değinerek okuyucuların dil hakkında derin bir anlayışa sahip olmalarını sağlar.

    Kitapta, Dart dilinin temelleri, değişkenler, veri türleri, kontrol yapıları, fonksiyonlar ve sınıflar gibi konuların yanı sıra, asenkron programlama, Flutter, web uygulama geliştirme gibi ileri konular da ele alınmaktadır. Ayrıca, her bölümde örnek kodlar ve uygulamalarla birlikte öğrenme süreci daha da kolaylaştırılmaktadır.

    Bu kitap, başlangıç düzeyinden orta düzeye kadar olan her seviyedeki okuyuculara hitap etmektedir. Okuyucular, Dart programlama dilinin tüm yönlerini kapsayan bu kaynak sayesinde, geliştirme projelerinde etkin bir şekilde kullanabilecekleri bilgi ve becerileri kazanacaklardır.

    Sonuç olarak, bu kitap hem başlangıç seviyesindeki öğrenciler hem de deneyimli geliştiriciler için değerli bir kaynak olacaktır.

    Umarım, Dart programlama dili hakkında bilgi edinmek ve yeteneklerini geliştirmek isteyen herkes için yararlı bir kaynak olur.

    ––––––––

    ZEUZ IT YAZILIM EKİBİ

    WHAT IS DART ?

    Dart programlama dilinin logosuna baktığımızda bir dart okunun arka ucu olduğunu görüyoruz.

    Bu oku dart dili, okun fırlatıldığı tahtayı da dart ekosistemi olarak düşünürsek, bu okun ciddi anlamda optimize edilmesi gerekir.

    Ayrıca okun yapısına baktığımızda hızlı hareket edecek şekilde (saatte 64 km) tasarlandığını görürüz ki bu da dart dilinin hedef aldığı platformlara hızlı derlenebilmesi metaforu taşıyor olabilir.

    Dart oku tahtaya fırlatıldığında her ne kadar küçük olsa bile, oyuncunun istediği son şey onu parçalara ayırmaktır. Bu da dilin ölçeklenebilirliği, sürdürülebilirliği ve zaman içinde okunabilirliği korumak için yeterince kararlı olması metaforu taşıyor.

    Dart tahtasına atılan dart okları oyuncu tarafından defalarca alınıp tekrar atılabilir. Bu da dilin değiştirilebilir olduğu (hot reload) metaforu taşıyor.

    DART DİLİNİN ÖZELLİKLERİ

    Type Safety

    Type Safety kısaca, programımızda bir veri üzerinde gerçekleştirmek istediğimiz bir işlem varsa, bunun veri türüne uygun olması gerektiğidir. Aksi halde dart bize izin vermez.

    Örneğin bir x adında integer bir veri türüne

    x.toUpperCase();

    x.toLowerCase();

    Gibi string veri türüne ait metotları integer veri türüne uygulayamayız. Benzer şekilde string y olarak tanımlanan bir veriye integer değer atayamamamız gibi.

    O zaman dart programcıların typesafe kod yazıp yazmadığını analiz eden bir araca sahip olmalıdır.

    Bu noktada iki tür type checking mekanizması devreye girer.

    Static Type Checking Ve Dynamic (Runtime) Type Checking

    Bazı programlama dilleri STC kullanırken bazıları DTC kullanır bazıları ise ikisini beraber kullanır. Örneğin Java programlama dili STC kullanır ve bir verinin türünü compile time ’da belirtmek zorundasındır. Burada belirttiğin türe göre işlem görür ve derlenir.

    int x = 10;

    DTC kullanılan bir dilde (örneğin ruby veya javascript),

    x = 10;

    şeklinde bir atama yapabiliyoruz. Compiler ya da interpreter yapılan işleme, bu işlemden dönen değere bakarak gerekirse x ‘in tipini değiştirebiliyor. Bir an string değer alıyor başka bir an int, double... vs. gibi.

    STC derleme esnasında type checking yapıldığı için programın çalışması esnasında (run time) ekstra type checking yapmaz ve buda daha az kaynak kullanımı ve uygulamaların çok daha verimli ve hızlı çalışması anlamına gelir.

    DTC run time esnasında tip kontrollerini yaptığı için her değişkenin tip bilgisini hafızada saklanmak zorundadır. Değişkenlerin içerisindeki değerler, her işlem sonrası değişebileceği için değişkenlerin o an hangi tipe sahip olduğunun bilinebilmesi bu bilgilere bağlıdır. Bu da ekstra bir hafıza yükü demektir.

    STC daha çok lokal bir kontroldür. Geliştirici kod yazarken kontrol yapar ve yanlış veri türü yazmasını engeller.

    DTC, geliştiricilere çok büyük esneklik sağlar. Bazı uygulamalarda gelen verinin türünün bilinmediği durumlarda çok kullanışlıdır. Öte yandan programcılar, bir değişkene farklı noktalarda pek çok farklı türde değer atayabilir, buda değerin değişkene atanmadığı, beklenenden farklı atandığı vs. gibi durumlarda run-time ‘da programın hata vermesi, çökmesi gibi tehlikeli durumlara yol açabilir.

    Dart dili her iki type checking mekanizmasını da kullanır. Bir değişkeni Dynamic Type atayarak dart STC mekanizmasının bu değişkeni denetlememesini belirtir denetlemenin run-time ‘da DTC tarafından yapılmasını sağlayabiliriz.

    dynamic pi = 3.14;

    .

    .

    pi.randomIntValue();

    yukarıdaki örnekte pi değişken değeri double veri türünde atadıktan sonra, bu değişken(aslında bir obje, dart dilinde değişkenlerde dahil her şey bir objedir.) içinden rastgele integer değer üreten methodu çağırdığımızda dart dili DTC mekanizması run-time ‘da

    Double sınıfına tanımlı randomIntValue() adında bir instance method bulunmuyor...

    şeklinde bir exception(hata) fırlatacaktır. Dynamic Type kulağa biraz tehlikeli gelebilir ancak bu işlevselliğe ihtiyaç duyduğumuz anlar olacak, bunu ilerleyen kısımlarda göreceğiz.

    Peki biz pi değişken değerini dynamic tanımlamamıza rağmen dart dili run-time ‘da bu değişken değerinin double olduğunu nasıl biliyor ? Bunun cevabını bir sonraki başlığımızda bulacağız.(Type Inference)

    Type Inference(Tür Çıkarımı)

    Dart’ın typesafe bir programlama dili olduğunu anladık ancak her seferinde veri türünü açıklamamız gerekmez. Çünkü dart tür çıkarımı(type inference) yapabilir.

    ‘var’ önekini kullanarak tanımladığımız bir değişken, STC(static type checking) mekanizmasından hatasız bir şekilde geçecektir. Kodların akışında ilerleyen satırlarda bu değişkene herhangi bir değer atandığı anda STC mekanizması bu değişkeni atandığı değerin veri türüne dönüştürecektir. Bundan sonra o değişken programdaki ömrü boyunca o veri türünde kalacaktır.

    Burada dikkat etmemiz gereken nokta bu dönüşüm run-time da DTC mekanizmasında değil, STC mekanizması tarafından compile edilirken(compile-time) gerçekleşir.

    Ancak daha önceden bahsettiğimiz gibi bu veri türü dönüşümünün run-time da yapılmasını isteyeceğimiz bazı durumlar vardır. Dynamic’ türünü kullanarak tanımladığımız bir değişken, STC mekanizmasının kontrolünden geçmez ve compile-time dan hatasız bir şekilde run-time a geçer. Atama ve veri türü dönüşümü run-time da olacaktır. Bu veri türü run-time da aldığı değere göre int, double, string vs. dönüşebilir.

    var ve dynamic biraz kafa karıştırıcı olabilir.

    Öncelikle bilmemiz gereken var önekinin bir veri türü olmadığıdır. Bu sadece bir ön ektir ve STC mekanizmasına bunun kodun akışı içerisinde alacağı değere göre ilgili veri türüne dönüştür demektir.

    dynamic ise int gibi string gibi başlı başına bir veri türüdür. Çünkü bu veri türünde tanımlanan bir değişken STC’den hatasız geçer. Run-time da alacağı değerlere göre başka veri türlerine dönüştürülecek bir türdür. Ancak var ile tanımlanan değişkene değer atandığı andan itibaren program ömrü boyunca aldığı değerin veri türüne sahip olacaktır

    Şimdi daha iyi anlamak için aşağıdaki kodları inceleyelim.

    void main(List args) {

    var a;

    print(a.runtimeType);

    print(kodlar işlemler cereyan eder);

    a = 15;

    print(a.runtimeType);

    //a = String; => atama yukarıda yapıldı, hata alırız.

    }

    var öneki kullanılarak tanımlanan a değişkeninin veri türü değer atamadan önce ve sonra ekrana yazdırılmış. Sonuç aşağıdaki gibi olacaktır.

    Null

    kodlar işlemler cereyan eder

    int

    atama değeri aldıktan sonra compile-time ‘da STC mekanizması a değişken değerini int veri türünü dönüştürür ve program ömrü boyunca a değişkeni int türünde kalır. Atama yapıldıktan sonra a değişkenine farklı türde bir değer atamaya kalkarsak hata alırız.

    import 'dart:math';

    void main(List args) {

    dynamic a;

    List karisikVeriTuruListesi = [String, 15, true, 3.14];

    Random random = new Random();

    a = karisikVeriTuruListesi.elementAt(random.nextInt(4));

    print(dynamic a değişken değeri : $a);

    print(dynamic a değişken veri türü : ${a.runtimeType});

    }

    Burada ise a değişken değeri dynamic türde tanımlanmıştır. Programı f5 ile her yeniden compile edip çalıştırdığımızda a değişkeni farklı bir değer alır ve dolayısıyla run-time ‘da DTC mekanizması tarafından farklı bir veri türüne dönüştürülür. Olası program çıktıları aşağıdaki gibidir.

    dynamic a değişken değeri : String

    dynamic a değişken veri türü : String

    dynamic a değişken değeri : true

    dynamic a değişken veri türü : bool

    ––––––––

    var öneki ve dynamic veri türünü, obje alanları(fields, sınıf değişkenleri), metotlar ve generic type arguments’larda kullanılabilir.

    Peki ilk örnekte yani var ön ekini kullanarak bir değişken tanımladık diyelim ve bu değişken ilerleyen kodlar içerisinde hiçbir değer almadan öylece kaldı. Örnekten de görülebileceği gibi bu durumda DTC mekanizması run-time da bu değere null yani değersiz-boş değerini atayacaktır. Bu iyi bir durum değildir, boşuna RAM’da yer ayırmış oluruz, programın ilerleyen aşamalarında bu değerin null olmadığını varsayarak yazmış olduğumuz kodlar hataya sebep olur ve programımız crash verir vs. Bunun gibi durumlar için dart diline 2.12 sürümü ile birlikte null safety özelliği gelmiştir.

    Null Safety

    null safety biz olabileceğini söylemediğimiz sürece hiçbir değerin null olamayacağı anlamına gelir.

    Bunun kontrolünü önceki bölümlerde sıkça bahsettiğimiz STC ve DTC compile ve runtime da yapar.

    Dart programlarımız içinde veriler null olabilir veya null olamaz. Ancak asla her ikisi birden olamaz.

    Null safe özelliğine sahip diğer programlama dillerinin aksine bir değişken non-nullable yani null olamaz tanımlandığı zaman bu her zaman korunur. Bu non-nullability özelliği run-time ‘da bile korunur.

    Null safety konusuna ilerleyen aşamalarda değineceğiz.

    DART COMPİLERS

    Dart kodumuzu nasıl çalışan programlara dönüştürür?

    Diğer dillerde olduğu gibi dart dili yazdığımız dart kodlarını diğer dillere veya belirli bir platformda çalışabilen makine koduna dönüştüren compiler’a sahiptir.

    Dart farklı işler için farklı compiler’lar kullanır. Dart dili çeşitli işlemci mimarilerine göre Just In Time Compiler (JIT) ve Ahead Of Compiler(AOT) kullanır. Ayrıca development sürecinde kullanılan dartdevc compiler’ı ve web için ise kodu javascripte çeviren dart2js compiler’ı kullanır.

    Geliştirme süreçlerinde en az 2 aşama vardır. Bunlar Development ve Production süreçleridir.

    Geliştirme aşamasında developerlar olarak kodumuzun esnek, test edilmesi ve hata ayıklanması kolay olmasını istiyoruz. Bu nedenle bu aşamada çalışan uygulama, kod değişimleri arasında daha hızlı yineleme yapmak için zengin debugging desteği, live metrics ve fast coding cycle gibi birden çok özellikten yararlanmalıdır. İşte tüm bu özellikleri JİT Compiler’ı sağlar. Bu derleyici adından da anlaşılabileceği gibi yalnızca ihtiyaç duyduğu kod miktarını ihtiyaç olduğu zamanda derler. Örneğin main.dart dosyamızda 10.000 satır kod olduğunu varsayalım, geliştirme aşamasında jit compiler tüm kodu değil o an ihtiyaç duyduğu satır miktarını derler. Bu aynı zamanda uygulamayı yeniden başlattığımızda önceden kalan mevcut derlemenin kullanılacağı anlamına gelir. Jit compiler ayrıca incremental recompilation özelliği ile gelir ki buda yalnızca gerektiğinde değiştirilen kısmı yeniden derleyecektir. Ayrıca hot reload(uygulama çalışırken, kodda yapılan değişikler yeniden derlemeye ihtiyaç duymadan otomatik olarak uygulamaya yansır.) bu özellik ile çalışır.

    Jit compiler kodlarımızı dart virtual machine tarafından çalıştırılabilen bir aracı koda dönüştürür. Bu sayede development aşamasında değişiklikler hızlıca çalışan uygulamaya yansır.

    Production aşamasında Jit compiler ‘ın bize sunduğu özelliklere ihtiyacımız olmaz, tek ihtiyacımız uygulamamızın kullanıcı tarafında hızlıca açılmasını sağlamak olacaktır. Dolayısıyla uygulama kodlarımızı sunacağımız platformun native machine koduna derlememiz gerekir. Bu işi AOT(Ahead of Time) Compiler’ı gerçekleştirecektir. Bunu yaptıktan sonra uygulamamız artık son kullanıcının bulunduğu platforma sunulabilecek en iyi optimizasyon ile son halini almış demektir.

    DART SDK

    Sdk(Software Development Kit) => Yazılım Geliştirme Kiti anlamına gelmektedir.

    Adından da anlaşılacağı gibi uygulamaların oluşturulmasını kolaylaştıran yazılım geliştirme araçlar topluluğudur.

    Dart ve Flutter için iki ayrı sdk bulunmaktadır.1.21 sürümünden sonra tüm flutter sdk’leri dart sdk’ini de içeriyor. Ancak sadece dart sdk i ile flutter uygulaması geliştiremeyeceğimizi bilmeliyiz.

    Ayrıca dart kodlarımızı test edebileceğimiz https://dartpad.dev/ adresi de mevcuttur.

    Dart sdk’in 3 farklı yayın kanalı bulunuyor.

    Stable channel, Beta channel ve Dev channel.

    Stable channel, dart sdk'nin kararlı sürümlerini içerir. Üretim amaçlı kullanıma uygundur ve kabaca her 3 ayda bir güncellenir. Kararlı kanal sürümlerinde x.y.z sürüm dizeleri bulunur. x'in ana sürüm olduğu yerde, y alt sürümdür ve z, yama sürümüdür.

    Beta channel, dart sdk’nin ön izleme sürümlerini içerir. Bu, genellikle beta sürümünde sunulanların daha sonra kararlı kanala tanıtılacağı anlamına gelir. Buradaki yeni özellikler yeterince kararlı çalışıyorsa, beta kanalındaki versiyon ile mevcut uygulamalarımızın gelecekteki dart sürümleriyle uyumluluğunu test etmek için kullanımı öneriliyor ve genellikle her ay güncellenir.

    Dev channel, desteklenmeden bozulabilecek ve istenmeyen sonlandırma değişiklikleri içerebilecek ön yayınlar içerir. Ayrıca dart'ta tanıtılan en son kod değişikliklerini içerirler ve genellikle haftada iki kez güncellenir.

    DART PROJE YAPISI

    Burada aşina olamayacağımız tek kısım Dart Linting kısmıdır.

    analysis_options.yaml dosyası, statik dart analizörünün, linting adı verilen bir işlem ile bir dizi kuralı izleyerek kodu nasıl taradığı ile ilgilidir.

    DART PACKAGES

    Dart Projesi diye bir kavram aslında yoktur. Bunun yerine Dart Package kullanmalıyız.

    Dart ile uygulama geliştirirken dart projesi kavramını değil dart paketi kavramını kullanacağız.

    Peki Dart Package tam olarak nedir?

    Genel bir cümle kuracaksak, Dart Paketi(Package) dart ekosisteminin ana bileşenidir.

    Ekosistem içindeki her şey dart paketleri etrafında döner. Tüm dünyadaki dart geliştiricileri, dart paketlerini https://pub.dev/ adresine yükleyip, birbirleri ile yardımlaşırlar. Kimse sıfırdan bir http paketi yazmak istemez.

    pub.dev’de bir paket

    Enjoying the preview?
    Page 1 of 1