# 12. Hafta — Seçim Bileşenleri

## Bu hafta ne yapacağız?

Bir öğrencinin kulüp, toplantı günü, geliştirmek istediği beceriler ve bildirim tercihini kaydeden form geliştireceğiz. Tek seçim, çoklu seçim ve açık/kapalı değerleri için doğru bileşeni kullanacağız. Ardından seçimlere göre fiyatı canlı hesaplayan kantin sipariş uygulaması yapacağız.

## Kazanımlar

- Tek seçim için radio veya segmented button kullanma
- Çoklu seçim için checkbox kullanma
- İkili ayar için switch kullanma
- Uzun seçenek listesini açılır menüyle sunma
- Seçimlerden özet ve hesaplanan değer üretme

## Uygulama 12 — Kulüp Tercih Formu

### 1. Tek kulüp seçimi

```dart
String kulup = 'Kodlama';

RadioListTile<String>(
  title: Text(kulupAdi),
  value: kulupAdi,
  groupValue: kulup,
  onChanged: (deger) => setState(() => kulup = deger ?? kulup),
)
```

Aynı gruptaki radio seçeneklerinden yalnız biri seçilebilir.

### 2. Toplantı günü

```dart
DropdownButtonFormField<String>(
  initialValue: gun,
  items: gunler.map((g) => DropdownMenuItem(value: g, child: Text(g))).toList(),
  onChanged: (deger) => setState(() => gun = deger ?? gun),
)
```

### 3. Birden fazla beceri seçimi

```dart
final beceriler = <String>{'Flutter'};

onChanged: (secili) {
  setState(() {
    secili == true ? beceriler.add(beceri) : beceriler.remove(beceri);
  });
}
```

`Set`, aynı becerinin iki kez eklenmesini engeller. Hiç beceri seçilmezse kaydetme düğmesi devre dışı kalır.

### 4. Bildirim anahtarı ve özet

`SwitchListTile` yalnız iki durum taşıyan bildirim ayarı için uygundur. Testte Robotik, Flutter ve Takım çalışması seçildi; Çarşamba günü ve açık bildirim bilgileri özette doğrulandı.

![Kaydedilmiş Robotik kulübü tercih formu](../../screenshots/week-12-adapted.png)

## Özgün proje — Kantin Siparişi

Ana ürün tek seçimdir; ek malzemeler çoklu, paket servis ise açık/kapalı seçimdir.

### Canlı toplam hesabı

```dart
double get toplam {
  final urunFiyati = fiyatlar[urun]!;
  final ekMalzeme = ekler.length * 7.5;
  final urunler = (urunFiyati + ekMalzeme) * adet;
  return urunler + (paket ? 5 : 0);
}
```

Bu değer ayrı bir değişkende kopyalanmaz; her seçimden sonra güncel durumdan hesaplanır.

### Ana ürün seçimi

```dart
SegmentedButton<String>(
  segments: fiyatlar.entries.map((kayit) => ButtonSegment(
    value: kayit.key,
    label: Text('${kayit.key}\n₺${kayit.value.toStringAsFixed(0)}'),
  )).toList(),
  selected: {urun},
  onSelectionChanged: (secim) => setState(() => urun = secim.first),
)
```

Testte tost adedi 2 yapıldı, kaşar eklendi ve paket servis açıldı. `(45 + 7,50) × 2 + 5` işlemi `₺110,00` üretti; sipariş özeti aynı seçimleri gösterdi.

![İki kaşarlı tost için hazırlanmış Kantin Siparişi](../../screenshots/week-12-original.png)

## Sıra sende

1. Kolay: Kulüp formuna “Müzik” seçeneği ekle.
2. Orta: Kantin uygulamasına içecek seçimi ve fiyatı ekle.
3. İleri: Stokta olmayan ürünü devre dışı bırak; seçim değişince kullanıcının önceki ek malzemelerini uygun biçimde koru veya temizle.

Çözümünü gönderdikten ve geri bildirim aldıktan sonra Kantin Siparişi’nin gerçek Dart kodu ve çalışan proje paketi açılacaktır. İpucu doğru seçim bileşenini belirlemene yardım edecek; çözüm düğmesi eksiksiz `lib/main.dart` kodunu gösterecektir.

## Kontrol listesi

- Tek seçimde radio/segmented button, çoklu seçimde checkbox kullanıldı.
- Açık/kapalı ayar switch ile gösterildi.
- Toplam her seçim değişikliğinde doğru veriden yeniden hesaplanıyor.
- Sipariş özeti seçilen ürün, ekler, teslim ve toplamı içeriyor.
- İki proje Flutter widget testinden geçti ve gerçek ekran çıktıları görsel olarak doğrulandı.
