Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar
Dizi · 15/64 Dart Türkçe Tutorial
- Bölüm 1 — Konu 1: Dart Nedir, Nerede Kullanılır, Neden Flutter Bu Dili Seçti
- Bölüm 1 — Konu 2: Ortam Kurulumu (Dart SDK, DartPad, Terminal ile Çalıştırma)
- Bölüm 1 — Konu 3: İlk Program (`main()`, `print()`, Dosya Yapısı)
- Bölüm 1 — Konu 4: Yorum Satırları, Temel Sözdizimi Kuralları
- Bölüm 2 — Konu 5: Değişken Tanımlama — `var`, `final`, `const` Farkı
- Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
- Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme
- Bölüm 2 — Konu 8: `dynamic` ve `Object` — Ne Zaman Kullanılır, Ne Zaman Kaçınılır
- Bölüm 2 — Konu 9: Null Safety Temelleri (`?`, `!`, `late`'e Giriş)
- Bölüm 3 — Konu 10: Aritmetik, Atama, Karşılaştırma, Mantıksal Operatörler
- Bölüm 3 — Konu 11: `if / else if / else`
- Bölüm 3 — Konu 12: `switch` / `switch expression` (Modern Dart)
- Bölüm 3 — Konu 13: Ternary Operatör, `??`, `??=`, `?.`
- Bölüm 3 — Konu 14: `for`, `while`, `do-while` Döngüleri
- Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar
- Bölüm 4 — Konu 17: `Set` — Benzersiz Eleman Mantığı
- Bölüm 4 — Konu 18: `Map` — Key-Value Yapılar
- Bölüm 4 — Konu 19: Koleksiyon Üzerinde `for-in`, `forEach`
- Bölüm 4 — Konu 20: Spread Operatörü (`...`, `...?`) ve Collection If/For
- Bölüm 5 — Konu 21: Fonksiyon Tanımlama, Parametreler (Positional, Named, Optional)
- Bölüm 5 — Konu 22: Varsayılan Parametre Değerleri (Derinlemesine)
- Bölüm 5 — Konu 23: Arrow Function (`=>`) Sözdizimi
- Bölüm 5 — Konu 24: Fonksiyonlar Birinci Sınıf Vatandaş — Değişkene Atama, Parametre Olarak Geçme
- Bölüm 5 — Konu 25: Anonim Fonksiyonlar ve Closure Kavramı (Derinlemesine)
- Bölüm 5 — Konu 26: Recursion (Özyineleme)
- Bölüm 6 — Konu 27: Class Tanımlama, Constructor (Varsayılan, Named, Factory)
- Bölüm 6 — Konu 28: Alanlar (Fields), Metodlar, `this` Kullanımı (Derinlemesine)
- Bölüm 6 — Konu 29: Initializer List, Constructor Kısayolları (Derinlemesine)
- Bölüm 6 — Konu 30: Getter / Setter
- Bölüm 6 — Konu 31: Statik Üyeler (`static`)
- Bölüm 7 — Konu 32: Kalıtım (`extends`), `super` Kullanımı
- Bölüm 7 — Konu 33: Metod Override Etme, `@override`
- Bölüm 7 — Konu 34: Soyut Sınıflar (`abstract class`)
- Bölüm 7 — Konu 35: Interface Mantığı (`implements`)
- Bölüm 7 — Konu 36: Mixin (`with`)
- Bölüm 7 — Konu 37: `enum` — Basit ve Gelişmiş (Metotlu Enum'lar)
- Bölüm 8 — Konu 38: `try / catch / finally`, `throw`
- Bölüm 8 — Konu 39: Özel Exception Sınıfları Yazma
- Bölüm 8 — Konu 40: Sound Null Safety Derinlemesine — `late`, `required`, Non-Nullable Varsayılan Davranış
- Bölüm 8 — Konu 41: `assert` ile Geliştirme Zamanı Kontrolleri
- Bölüm 9 — Konu 42: Generic Sınıflar ve Fonksiyonlar
- Bölüm 9 — Konu 43: Generic Sınırlamalar (`<T extends ...>`)
- Bölüm 9 — Konu 44: Dart'ın Built-in Generic Koleksiyonları Nasıl Çalışır
- Bölüm 10 — Konu 45: `Future` Kavramı, `async`/`await`
- Bölüm 10 — Konu 46: `Future.then`, Hata Yönetimi (`catchError`)
- Bölüm 10 — Konu 47: `Stream` Temelleri, `async*`, `yield`
- Bölüm 10 — Konu 48: `StreamController`, Broadcast Stream
- Bölüm 11 — Konu 49: `map`, `where`, `reduce`, `fold`
- Bölüm 11 — Konu 50: `sort`, Custom Comparator ile Sıralama
- Bölüm 11 — Konu 51: Iterable Kavramı Derinlemesine (Lazy Evaluation)
- Bölüm 11 — Konu 52: Cascade Notasyonu (`..`)
- Bölüm 12 — Konu 53: `pubspec.yaml`, pub.dev'den Paket Ekleme
- Bölüm 12 — Konu 54: Kütüphane Oluşturma, `import`/`export`, `part`/`part of`
- Bölüm 12 — Konu 55: Dart'ta Test Yazımı (`test` Paketi, Unit Test Mantığı)
- Bölüm 12 — Konu 56: Extension Methods
- Bölüm 12 — Konu 57: Dart'ın Derleme Modelleri (JIT vs AOT) ve Bunun Flutter'a Etkisi
- Bölüm 13 — Konu 59: Dart 3 Pattern Matching — Records, Destructuring, Sealed Classes, Exhaustive Switch
- Bölüm 13 — Konu 60: `Never` Tipi, `covariant` ve Generic Variance Detayları
- Bölüm 13 — Konu 61: Event Loop Derinlemesine — Microtask Queue vs Event Queue
- Bölüm 13 — Konu 62: Memory Model & Performans — Garbage Collection, `const` Nesnelerin Bellek Avantajı
- Bölüm 13 — Konu 63: Isolate'ler Arası Mesajlaşmanın Maliyeti ve `compute()`'un İç İşleyişi
- Bölüm 13 — Konu 64: FFI (Foreign Function Interface) — C Koduna Erişim
- Bölüm 13 — Konu 65: Sunucu Tarafında Dart — `dart:io`, `shelf` Paketiyle Basit Bir Backend/CLI Aracı Yazma
- Bölüm 13 — Konu 66: Derleyici & Analiz Araçları — `dart analyze`, Custom Lint Kuralları, `build_runner` Mimarisi
İçindekiler 13 başlık
- List Nedir?
- Liste Oluşturma
- Elemanlara Erişim — İndeks Kullanımı
- length — Liste Uzunluğu
- Eleman Ekleme
- Eleman Çıkarma
- Elemanı Güncelleme
- Arama ve Kontrol Metodları
- List.filled ve List.generate — Belirli Boyutta Liste Oluşturma
- Değişebilir (Mutable) vs Değişmez (Immutable, const/unmodifiable) Listeler
- List.unmodifiable — Var Olan Bir Listeyi Değiştirilemez Yapma
- 🎯 Bu Dersten Çıkarılması Gerekenler
- 📝 Ödevler
Bölüm 4'e hoş geldin. Bu bölümde koleksiyonları — birden fazla veriyi bir arada tutan yapıları — işleyeceğiz. İlk durağımız, en sık kullanılan koleksiyon tipi: List.
List Nedir?
List, sıralı (ordered) bir eleman dizisidir — her elemanın bir indeksi (sıra numarası, 0'dan başlar) vardır ve aynı değer birden fazla kez listede bulunabilir. Diğer dillerdeki "array" veya "dizi" kavramına karşılık gelir.
Liste Oluşturma
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz"];
print(meyveler); // [Elma, Armut, Muz]
var sayilar = [1, 2, 3, 4, 5]; // tip çıkarımı ile List<int>
print(sayilar);
List<int> bosListe = []; // boş liste
print(bosListe); // []
}List<String> ifadesindeki <String> kısmı, listenin hangi tipte elemanlar tutacağını belirtir — buna generic tip parametresi denir (Bölüm 9'da generics konusunda derinlemesine işleyeceğiz). Şimdilik "bu liste sadece String tutabilir" anlamına geldiğini bilmen yeterli.
Tip güvenliği burada da geçerli:
void main() {
List<String> meyveler = ["Elma", "Armut"];
meyveler.add(42); // ❌ HATA! int, List<String>'e eklenemez
}Elemanlara Erişim — İndeks Kullanımı
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz"];
print(meyveler[0]); // Elma — ilk eleman, indeks 0'dan başlar
print(meyveler[1]); // Armut
print(meyveler[2]); // Muz
}Sınır dışı erişim (out of bounds) hatası:
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz"];
print(meyveler[5]); // ❌ RUNTIME HATASI! RangeError
}Bu hata derleme zamanında yakalanmaz — Dart, listenin çalışma zamanındaki gerçek uzunluğunu bilmediği için, geçersiz bir indekse erişmeye çalıştığında ancak program çalışırken hata verir. Bu yüzden indeks kullanırken listenin uzunluğunu kontrol etmek önemlidir.
length — Liste Uzunluğu
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz"];
print(meyveler.length); // 3
print(meyveler[meyveler.length - 1]); // Muz — son eleman
}meyveler.length - 1, listenin son elemanının indeksidir (çünkü indeksler 0'dan başlar, 3 elemanlı bir listenin son indeksi 2'dir, yani length - 1).
Eleman Ekleme
void main() {
List<String> meyveler = ["Elma", "Armut"];
meyveler.add("Muz"); // sona ekler
print(meyveler); // [Elma, Armut, Muz]
meyveler.insert(1, "Çilek"); // belirli bir indekse ekler
print(meyveler); // [Elma, Çilek, Armut, Muz]
meyveler.addAll(["Kiraz", "Üzüm"]); // birden fazla eleman ekler
print(meyveler); // [Elma, Çilek, Armut, Muz, Kiraz, Üzüm]
}Eleman Çıkarma
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz", "Elma"];
meyveler.remove("Elma"); // İLK eşleşen "Elma"yı siler
print(meyveler); // [Armut, Muz, Elma]
meyveler.removeAt(0); // indeks 0'daki elemanı siler
print(meyveler); // [Muz, Elma]
meyveler.removeLast(); // son elemanı siler
print(meyveler); // [Muz]
meyveler.clear(); // tüm elemanları siler
print(meyveler); // []
}Elemanı Güncelleme
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz"];
meyveler[1] = "Çilek"; // indeks 1'deki elemanı değiştirir
print(meyveler); // [Elma, Çilek, Muz]
}Arama ve Kontrol Metodları
void main() {
List<String> meyveler = ["Elma", "Armut", "Muz"];
print(meyveler.contains("Armut")); // true
print(meyveler.indexOf("Muz")); // 2 — bulunamazsa -1 döner
print(meyveler.isEmpty); // false
print(meyveler.isNotEmpty); // true
print(meyveler.first); // Elma
print(meyveler.last); // Muz
}List.filled ve List.generate — Belirli Boyutta Liste Oluşturma
void main() {
// Belirli boyutta, sabit değerle dolu liste
List<int> sifirlar = List.filled(5, 0);
print(sifirlar); // [0, 0, 0, 0, 0]
// Bir fonksiyonla üretilen liste
List<int> kareler = List.generate(5, (index) => index * index);
print(kareler); // [0, 1, 4, 9, 16]
}List.generate, ikinci parametre olarak bir fonksiyon alır — bu fonksiyon her indeks için çağrılır ve dönen değer o indekse yerleştirilir. Fonksiyonları henüz detaylı işlemedik (Bölüm 5) ama (index) => index * index şeklindeki kısa yazımı ("arrow function") burada bir önizleme olarak gördün.
Değişebilir (Mutable) vs Değişmez (Immutable, const/unmodifiable) Listeler
void main() {
List<int> degisebilirListe = [1, 2, 3];
degisebilirListe.add(4); // ✅ çalışır
print(degisebilirListe); // [1, 2, 3, 4]
const sabitListe = [1, 2, 3];
sabitListe.add(4); // ❌ HATA! const liste değiştirilemez
}Bölüm 2'de final/const konusunda değindiğimiz "değişkenin kendisi mi, içeriği mi sabit" ayrımını burada net görüyorsun: const ile tanımlanan bir liste, hem değişkeni yeniden atamaya hem de içeriğini değiştirmeye kapalıdır. final ise sadece değişkenin yeniden atanmasını engeller, içeriği (add/remove) yine değiştirilebilir.
void main() {
final liste = [1, 2, 3];
liste.add(4); // ✅ çalışır — final sadece yeniden atamayı engeller
print(liste); // [1, 2, 3, 4]
liste = [5, 6]; // ❌ HATA! final değişken yeniden atanamaz
}List.unmodifiable — Var Olan Bir Listeyi Değiştirilemez Yapma
void main() {
List<int> orijinal = [1, 2, 3];
List<int> degistirilemez = List.unmodifiable(orijinal);
degistirilemez.add(4); // ❌ RUNTIME HATASI! UnsupportedError
}Bu, bir listeyi başka bir kod parçasına "sadece okuma amaçlı" olarak vermek istediğinde kullanışlıdır — alıcı tarafın listeyi yanlışlıkla değiştirmesini engeller.
🎯 Bu Dersten Çıkarılması Gerekenler
List, sıralı ve indeksli bir koleksiyondur, indeksler 0'dan başlar.- Sınır dışı indeks erişimi runtime'da
RangeErrorverir — derleme zamanında yakalanmaz. - Temel metodlar:
add,insert,addAll,remove,removeAt,removeLast,clear. - Arama/kontrol:
contains,indexOf,isEmpty,isNotEmpty,first,last. List.filledveList.generateile belirli boyutta liste oluşturulabilir.constliste hem değişkeni hem içeriği kilitler;finalsadece değişkeni kilitler, içerik değişebilir;List.unmodifiablevar olan bir listeyi sonradan salt-okunur yapar.
📝 Ödevler
- [ ] 5 elemanlı bir sayı listesi oluştur,
for-inile tüm elemanları yazdır. - [ ] Bir listeye eleman ekle, belirli bir indekse eleman ekle, bir elemanı sil ve son halini yazdır.
- [ ]
containsveindexOfkullanarak bir listede belirli bir elemanın olup olmadığını ve konumunu kontrol et. - [ ]
List.generatekullanarak 1'den 10'a kadar sayıların küplerini içeren bir liste oluştur. - [ ]
finalbir liste ileconstbir listeyi karşılaştır: ikisine de.add()çağırmayı dene, farkı gözlemle ve yorumla.
Sıradaki konu: Bölüm 4 — Konu 17: Set — Benzersiz Eleman Mantığı