↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar

2 dk okuma #dart
Dizi · 15/64 Dart Türkçe Tutorial
  1. Bölüm 1 — Konu 1: Dart Nedir, Nerede Kullanılır, Neden Flutter Bu Dili Seçti
  2. Bölüm 1 — Konu 2: Ortam Kurulumu (Dart SDK, DartPad, Terminal ile Çalıştırma)
  3. Bölüm 1 — Konu 3: İlk Program (`main()`, `print()`, Dosya Yapısı)
  4. Bölüm 1 — Konu 4: Yorum Satırları, Temel Sözdizimi Kuralları
  5. Bölüm 2 — Konu 5: Değişken Tanımlama — `var`, `final`, `const` Farkı
  6. Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
  7. Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme
  8. Bölüm 2 — Konu 8: `dynamic` ve `Object` — Ne Zaman Kullanılır, Ne Zaman Kaçınılır
  9. Bölüm 2 — Konu 9: Null Safety Temelleri (`?`, `!`, `late`'e Giriş)
  10. Bölüm 3 — Konu 10: Aritmetik, Atama, Karşılaştırma, Mantıksal Operatörler
  11. Bölüm 3 — Konu 11: `if / else if / else`
  12. Bölüm 3 — Konu 12: `switch` / `switch expression` (Modern Dart)
  13. Bölüm 3 — Konu 13: Ternary Operatör, `??`, `??=`, `?.`
  14. Bölüm 3 — Konu 14: `for`, `while`, `do-while` Döngüleri
  15. Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar
  16. Bölüm 4 — Konu 17: `Set` — Benzersiz Eleman Mantığı
  17. Bölüm 4 — Konu 18: `Map` — Key-Value Yapılar
  18. Bölüm 4 — Konu 19: Koleksiyon Üzerinde `for-in`, `forEach`
  19. Bölüm 4 — Konu 20: Spread Operatörü (`...`, `...?`) ve Collection If/For
  20. Bölüm 5 — Konu 21: Fonksiyon Tanımlama, Parametreler (Positional, Named, Optional)
  21. Bölüm 5 — Konu 22: Varsayılan Parametre Değerleri (Derinlemesine)
  22. Bölüm 5 — Konu 23: Arrow Function (`=>`) Sözdizimi
  23. Bölüm 5 — Konu 24: Fonksiyonlar Birinci Sınıf Vatandaş — Değişkene Atama, Parametre Olarak Geçme
  24. Bölüm 5 — Konu 25: Anonim Fonksiyonlar ve Closure Kavramı (Derinlemesine)
  25. Bölüm 5 — Konu 26: Recursion (Özyineleme)
  26. Bölüm 6 — Konu 27: Class Tanımlama, Constructor (Varsayılan, Named, Factory)
  27. Bölüm 6 — Konu 28: Alanlar (Fields), Metodlar, `this` Kullanımı (Derinlemesine)
  28. Bölüm 6 — Konu 29: Initializer List, Constructor Kısayolları (Derinlemesine)
  29. Bölüm 6 — Konu 30: Getter / Setter
  30. Bölüm 6 — Konu 31: Statik Üyeler (`static`)
  31. Bölüm 7 — Konu 32: Kalıtım (`extends`), `super` Kullanımı
  32. Bölüm 7 — Konu 33: Metod Override Etme, `@override`
  33. Bölüm 7 — Konu 34: Soyut Sınıflar (`abstract class`)
  34. Bölüm 7 — Konu 35: Interface Mantığı (`implements`)
  35. Bölüm 7 — Konu 36: Mixin (`with`)
  36. Bölüm 7 — Konu 37: `enum` — Basit ve Gelişmiş (Metotlu Enum'lar)
  37. Bölüm 8 — Konu 38: `try / catch / finally`, `throw`
  38. Bölüm 8 — Konu 39: Özel Exception Sınıfları Yazma
  39. Bölüm 8 — Konu 40: Sound Null Safety Derinlemesine — `late`, `required`, Non-Nullable Varsayılan Davranış
  40. Bölüm 8 — Konu 41: `assert` ile Geliştirme Zamanı Kontrolleri
  41. Bölüm 9 — Konu 42: Generic Sınıflar ve Fonksiyonlar
  42. Bölüm 9 — Konu 43: Generic Sınırlamalar (`<T extends ...>`)
  43. Bölüm 9 — Konu 44: Dart'ın Built-in Generic Koleksiyonları Nasıl Çalışır
  44. Bölüm 10 — Konu 45: `Future` Kavramı, `async`/`await`
  45. Bölüm 10 — Konu 46: `Future.then`, Hata Yönetimi (`catchError`)
  46. Bölüm 10 — Konu 47: `Stream` Temelleri, `async*`, `yield`
  47. Bölüm 10 — Konu 48: `StreamController`, Broadcast Stream
  48. Bölüm 11 — Konu 49: `map`, `where`, `reduce`, `fold`
  49. Bölüm 11 — Konu 50: `sort`, Custom Comparator ile Sıralama
  50. Bölüm 11 — Konu 51: Iterable Kavramı Derinlemesine (Lazy Evaluation)
  51. Bölüm 11 — Konu 52: Cascade Notasyonu (`..`)
  52. Bölüm 12 — Konu 53: `pubspec.yaml`, pub.dev'den Paket Ekleme
  53. Bölüm 12 — Konu 54: Kütüphane Oluşturma, `import`/`export`, `part`/`part of`
  54. Bölüm 12 — Konu 55: Dart'ta Test Yazımı (`test` Paketi, Unit Test Mantığı)
  55. Bölüm 12 — Konu 56: Extension Methods
  56. Bölüm 12 — Konu 57: Dart'ın Derleme Modelleri (JIT vs AOT) ve Bunun Flutter'a Etkisi
  57. Bölüm 13 — Konu 59: Dart 3 Pattern Matching — Records, Destructuring, Sealed Classes, Exhaustive Switch
  58. Bölüm 13 — Konu 60: `Never` Tipi, `covariant` ve Generic Variance Detayları
  59. Bölüm 13 — Konu 61: Event Loop Derinlemesine — Microtask Queue vs Event Queue
  60. Bölüm 13 — Konu 62: Memory Model & Performans — Garbage Collection, `const` Nesnelerin Bellek Avantajı
  61. Bölüm 13 — Konu 63: Isolate'ler Arası Mesajlaşmanın Maliyeti ve `compute()`'un İç İşleyişi
  62. Bölüm 13 — Konu 64: FFI (Foreign Function Interface) — C Koduna Erişim
  63. Bölüm 13 — Konu 65: Sunucu Tarafında Dart — `dart:io`, `shelf` Paketiyle Basit Bir Backend/CLI Aracı Yazma
  64. Bölüm 13 — Konu 66: Derleyici & Analiz Araçları — `dart analyze`, Custom Lint Kuralları, `build_runner` Mimarisi
Dizinin sayfası →
İçindekiler 13 başlık
  1. List Nedir?
  2. Liste Oluşturma
  3. Elemanlara Erişim — İndeks Kullanımı
  4. length — Liste Uzunluğu
  5. Eleman Ekleme
  6. Eleman Çıkarma
  7. Elemanı Güncelleme
  8. Arama ve Kontrol Metodları
  9. List.filled ve List.generate — Belirli Boyutta Liste Oluşturma
  10. Değişebilir (Mutable) vs Değişmez (Immutable, const/unmodifiable) Listeler
  11. List.unmodifiable — Var Olan Bir Listeyi Değiştirilemez Yapma
  12. 🎯 Bu Dersten Çıkarılması Gerekenler
  13. 📝 Ö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

dart
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:

dart
void main() {
  List<String> meyveler = ["Elma", "Armut"];
  meyveler.add(42); // ❌ HATA! int, List<String>'e eklenemez
}

Elemanlara Erişim — İndeks Kullanımı

dart
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ı:

dart
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

dart
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

dart
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

dart
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

dart
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ı

dart
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

dart
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

dart
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.

dart
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

dart
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 RangeError verir — derleme zamanında yakalanmaz.
  • Temel metodlar: add, insert, addAll, remove, removeAt, removeLast, clear.
  • Arama/kontrol: contains, indexOf, isEmpty, isNotEmpty, first, last.
  • List.filled ve List.generate ile belirli boyutta liste oluşturulabilir.
  • const liste hem değişkeni hem içeriği kilitler; final sadece değişkeni kilitler, içerik değişebilir; List.unmodifiable var olan bir listeyi sonradan salt-okunur yapar.

📝 Ödevler

  • [ ] 5 elemanlı bir sayı listesi oluştur, for-in ile tüm elemanları yazdır.
  • [ ] Bir listeye eleman ekle, belirli bir indekse eleman ekle, bir elemanı sil ve son halini yazdır.
  • [ ] contains ve indexOf kullanarak bir listede belirli bir elemanın olup olmadığını ve konumunu kontrol et.
  • [ ] List.generate kullanarak 1'den 10'a kadar sayıların küplerini içeren bir liste oluştur.
  • [ ] final bir liste ile const bir 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ığı