# 8. Hafta — Döngüler ve Listeler

## Bu hafta ne yapacağız?

Kullanıcının tam sayı ekleyip silebildiği, sıralayabildiği ve anlık özetini görebildiği bir liste uygulaması geliştireceğiz. Ardından yedi günlük adım verisini işleyerek toplam, günlük ortalama ve hedefe ulaşılan gün sayısını hesaplayan özgün bir proje yapacağız.

## Kazanımlar

- `List<T>` oluşturma; öğe ekleme, silme ve sıralama
- `map`, `where` ve `fold` ile liste işleme
- Listeyi `ListView` ve yayma operatörüyle ekrana dönüştürme
- Boş listeyi güvenli biçimde ele alma
- Model nesnelerinden tekrarlanan arayüz üretme

## Uygulama 08 — Sayı Listesi

### 1. Başlangıç listesini oluşturma

```dart
final List<int> sayilar = [12, 7, 25];
```

Türü `List<int>` olarak belirtmek, listeye yanlışlıkla metin eklenmesini engeller.

### 2. Güvenli biçimde sayı ekleme

```dart
final sayi = int.tryParse(sayiController.text);
if (sayi == null) {
  hata = 'Tam sayı giriniz.';
  return;
}
sayilar.add(sayi);
```

Ekleme `setState` içinde yapıldığı için hem liste hem özet kartları yeniden hesaplanır.

### 3. Toplam ve ortalama hesaplama

```dart
final toplam = sayilar.fold<int>(0, (toplam, sayi) => toplam + sayi);
final ortalama = sayilar.isEmpty ? 0 : toplam / sayilar.length;
```

`fold`, başlangıç değeri olan 0 üzerine her sayıyı sırayla ekler. Boş listede bölme yapılmaz.

### 4. Listeyi ekrana çizme

```dart
ListView.separated(
  itemCount: sayilar.length,
  itemBuilder: (context, index) {
    final sayi = sayilar[index];
    return ListTile(
      title: Text('$sayi'),
      subtitle: Text(sayi.isEven ? 'Çift sayı' : 'Tek sayı'),
      trailing: IconButton(
        onPressed: () => setState(() => sayilar.removeAt(index)),
        icon: const Icon(Icons.delete_outline),
      ),
    );
  },
)
```

Sıralama düğmesi `sayilar.sort()` kullanır. Testte 18 eklendi; adet 4, toplam 62, ortalama 15.5 oldu ve liste küçükten büyüğe sıralandı.

![Eklenmiş ve sıralanmış Sayı Listesi](../../screenshots/week-08-adapted.png)

## Özgün proje — Haftalık Adım Özeti

Her gün, gün adı ve adım miktarını birlikte taşıyan bir modeldir:

```dart
class GunAdimi {
  GunAdimi(this.gun, this.adim);
  final String gun;
  int adim;
}
```

### Listeyi özetleme

```dart
final toplam = gunler.fold<int>(0, (t, gun) => t + gun.adim);
final ortalama = toplam ~/ gunler.length;
final hedefGun = gunler.where((gun) => gun.adim >= 8000).length;
```

`where` hedefi geçen günleri süzer, `length` sayar. `~/` tam sayı bölmesi günlük ortalamayı tam adım olarak verir.

### Her gün için kart üretme

```dart
...gunler.map((gun) => Card(
  child: Row(children: [
    Text(gun.gun),
    Expanded(child: LinearProgressIndicator(
      value: (gun.adim / 8000).clamp(0, 1),
    )),
    Text('${gun.adim}'),
  ]),
))
```

İlerleme değeri 0–1 aralığına sıkıştırılır; hedefi aşan gün çubuğu taşmaz. Testte Pazartesiye 2.000 adım eklendi; toplam `56.650`, günlük ortalama `8.092` ve hedefe ulaşan gün sayısı 4 oldu.

![Güncellenmiş Haftalık Adım Özeti](../../screenshots/week-08-original.png)

## Sıra sende

1. Kolay: Sayı listesine “Tümünü temizle” düğmesi ekle.
2. Orta: Adım listesinin en yüksek ve en düşük gününü farklı renkle göster.
3. İleri: Günlük adımları düzenlenebilir yap ve haftalık hedef yüzdesini hesapla.

Çözümünü gönderdikten ve geri bildirim aldıktan sonra Haftalık Adım Özeti’nin gerçek Dart çözümü ve çalışan proje paketi açılacaktır. İpucu uygun liste metodunu seçmene yardım edecek; çözüm düğmesi eksiksiz `lib/main.dart` kodunu gösterecektir.

## Kontrol listesi

- Liste yalnız doğru türde veri kabul ediyor.
- Boş liste ortalama hesabında sıfıra bölünmüyor.
- Ekleme, silme ve sıralama ekranda gerçekten sonuç üretiyor.
- Tekrarlanan kartlar elle çoğaltılmadı; listeden üretildi.
- İki proje Flutter widget testinden geçti ve gerçek ekran çıktıları görsel olarak doğrulandı.
