# 36. Hafta — Derleme, Yayınlama ve Portfolyo

## Bu hafta ne yapacağız?

Bir Flutter projesini yayın adayı hâline getiren son kontrolleri uygulayacağız. Sürüm numarası, test, izin, gizlilik, simge ve release derlemesini yayın kapısında doğrulayacağız. Özgün uygulamada yıl boyunca geliştirilen projeleri çalışan bir Flutter portfolyosunda sunacağız.

## Kazanımlar

- Sürüm ve yapı numarasını ayırt etme
- Debug, profile ve release modlarını açıklama
- Android App Bundle/APK ve web çıktısı üretme
- Platform izinlerini ve gizliliği yayın öncesi denetleme
- Yayın kapısı yaklaşımıyla eksik kontrolü engelleme
- Projeyi problem, çözüm, teknoloji ve kanıtlarla sunma
- Uyarlanabilir Flutter portfolyo arayüzü oluşturma

## Sürüm biçimi

Flutter `pubspec.yaml` örneği:

```yaml
version: 1.0.0+1
```

- `1.0.0`: Kullanıcının gördüğü sürüm adı
- `+1`: Mağazanın kullandığı artan yapı numarası

Yayınlanan yeni paketin yapı numarası önceki sürümden büyük olmalıdır.

## Çözümlü uygulama — Flutter Yayın Kontrolü

### Kontrol modeli

```dart
class KontrolMaddesi {
  KontrolMaddesi(
    this.baslik,
    this.aciklama, {
    this.tamam = false,
  });

  final String baslik;
  final String aciklama;
  bool tamam;
}
```

### Sürüm biçimini doğrulama

```dart
bool get surumGecerli =>
    RegExp(r'^\d+\.\d+\.\d+\+\d+$')
        .hasMatch(surum.text.trim());
```

Bu kontrol semantik sürümün tamamını doğrulayan evrensel bir çözüm değildir; ders uygulamasının beklediği `1.0.0+1` biçimini korur.

### Yayın kapısı

```dart
bool get hazir =>
    surumGecerli && maddeler.every((m) => m.tamam);
```

```dart
if (!surumGecerli) {
  durum = 'Sürüm 1.0.0+1 biçiminde olmalı';
} else if (!maddeler.every((m) => m.tamam)) {
  final kalan = maddeler.where((m) => !m.tamam).length;
  durum = '$kalan yayın kontrolü daha tamamlanmalı';
} else {
  durum = 'Yayın adayı onaylandı: ${surum.text.trim()}';
}
```

![Flutter Yayın Kontrolü gerçek ekranı](../../screenshots/week-36-adapted.png)

Test başlangıçta tamamlanmamış bütün maddeleri işaretledi, yayın kapısını çalıştırdı ve `5/5` kontrol ile `1.0.0+1` adayının onaylandığını doğruladı.

## Flutter derleme komutları

```bash
flutter analyze
flutter test
flutter build appbundle --release
flutter build apk --release
flutter build web --release
```

- Play Store için genellikle AAB tercih edilir.
- APK cihazda doğrudan test için kullanılabilir.
- Web çıktısı `build/web` klasöründe oluşur.
- iOS release derlemesi macOS/Xcode ve imzalama gerektirir.

Komutun başarılı bitmesi tek başına uygulamanın yayın için uygun olduğunu kanıtlamaz. Gerçek cihaz, izin, çevrimdışı durum, performans ve erişilebilirlik kontrolleri de yapılır.

## Yayın öncesi güvenlik

- Gizli anahtarları Dart kaynak koduna yazmayın.
- Üretim API adresini yapılandırmadan alın.
- Kullanılmayan izinleri kaldırın.
- Uygulamanın topladığı kişisel verileri açıklayın.
- Bağımlılıkların lisans ve güvenlik durumunu inceleyin.
- Release imza anahtarını güvenli yerde saklayın.
- Hata loglarında öğrenci adı, token veya konum bırakmayın.

## Özgün uygulama — Flutter Portfolyom

### Proje modeli

```dart
class Proje {
  const Proje(
    this.ad,
    this.aciklama,
    this.teknolojiler,
    this.renk,
  );

  final String ad;
  final String aciklama;
  final List<String> teknolojiler;
  final Color renk;
}
```

### Proje seçimi

```dart
ChoiceChip(
  selected: secili == i,
  onSelected: (_) => setState(() {
    secili = i;
    durum = '${projeler[i].ad} seçildi';
  }),
  label: Text(projeler[i].ad),
)
```

### Teknoloji etiketleri

```dart
Wrap(
  spacing: 7,
  runSpacing: 7,
  children: proje.teknolojiler
      .map((teknoloji) => Chip(label: Text(teknoloji)))
      .toList(),
)
```

![Flutter Portfolyom gerçek ekranı](../../screenshots/week-36-original.png)

Test Akıllı Kantin’i seçti, açıklamasını doğruladı ve “Proje özetini hazırla” işlemi sonrasında dışa aktarma durumunu denetledi.

## Güçlü proje sunumu

Her proje için:

1. Problem: Kim hangi güçlüğü yaşıyordu?
2. Çözüm: Uygulama hangi iş akışını sağlıyor?
3. Teknik yapı: Model, veri, servis ve arayüz nasıl ayrıldı?
4. Zor karar: Hangi seçenekler arasında neden seçim yapıldı?
5. Test kanıtı: Hangi normal, sınır ve hata durumları doğrulandı?
6. Görsel kanıt: Gerçek uygulama ekranı
7. Kaynak: Çalışan proje ve kurulum adımları
8. İyileştirme: Sonraki sürümde ne yapılabilir?

Yalnız ekran resmi bir projenin çalıştığını kanıtlamaz; kaynak kod, test ve açıklama birlikte sunulur.

## Yayın kontrol listesi

- `flutter analyze` kritik hata vermiyor.
- Bütün birim ve widget testleri geçiyor.
- Release modunda gerçek cihazda temel akış çalışıyor.
- Sürüm/yapı numarası doğru ve önceki yapıdan büyük.
- Uygulama adı, paket kimliği ve simge doğru.
- Yalnız gereken izinler tanımlı.
- Gizlilik açıklaması gerçek veri kullanımına uyuyor.
- Ağ hatası ve çevrimdışı durum anlaşılır.
- Erişilebilirlik ve farklı ekranlar denetlendi.
- İmzalama anahtarı kaynak depoya eklenmedi.
- Mağaza ekran görüntüleri gerçek ve güncel.

## Üç uygulama görevi

### Kolay — Yayın raporu

Bir projenin sürüm, test, izin ve derleme kontrollerini kaydeden rapor ekranı oluşturun. Eksik madde varken onayı engelleyin.

### Orta — Üç projelik portfolyo

Üç projenizi problem, çözüm, teknoloji ve gerçek ekran görüntüsüyle sunun. Küçük/büyük ekran düzenini test edin.

### İleri — Otomatik kalite kapısı

Analiz, test, sürüm ve artefakt kontrollerini çalışan bir betikle raporlayın. Hata varsa release üretimini durdurun ve anlaşılır rapor oluşturun.

## Geri bildirim ve çözüm erişimi

Öğrenci yayın raporu ve portfolyosunu gönderdikten sonra **İpucunu göster**, eksik yayın kapısını bulmaya yarayan soruları sunar. **Örnek çözümü göster**, gerçek sürüm doğrulama, kontrol listesi, uyarlanabilir portfolyo ve proje seçim kodlarını açar. İndirme bağlantıları iki bağımsız Flutter projesini ve testlerini içerir.

## Kaynak projeler

- Konu uygulaması: `09 - Bütünleşik Proje ve Yayınlama/Uygulamalar/Uygulama-36-Yayın Kontrolü`
- Özgün uygulama: `09 - Bütünleşik Proje ve Yayınlama/Uygulamalar/Ozgun-36-Flutter Portfolyom`
