Dart enum yapıları, sınırlı sayıdaki geçerli durumu derleyicinin anlayabildiği bir tipe dönüştürür. Flutter durum modellerinde, API yanıtlarında ve kullanıcı akışlarında metin sabitleri yerine enum kullanmak geçersiz değerleri daha erken görünür kılar.
Enum Nedir? Problem Ne?
if (status == "loading") gibi metin karşılaştırmaları yazım hatalarına ve farklı büyük/küçük harf kullanımlarına açıktır. Enum, kabul edilen değer kümesini tek bir yerde tanımlar.
Enum, belirli sayıda sabit değer alabilen bir type. Yani “bu değişken sadece şu değerlerden birini alabilir” diyorsunuz ve compiler bunu garanti ediyor. Type safety at its best!
Neden String Yerine Enum?
String kullanırsanız:
- Typo yapabilirsiniz (“sucess” yerine “success”)
- Hangi değerlerin valid olduğunu bilemezsiniz
- IDE autocomplete yardım edemez
- Refactoring cehennem olur
Enum kullanırsanız:
- Compiler yanlış değer kullanmanıza izin vermez
- Tüm olası değerleri görürsünüz
- IDE size yardım eder
- Refactoring tek tıkla hallolur
Basit Kullanım
// Define enum
enum Status { idle, loading, success, error }
// Use it
Status currentStatus = Status.loading;
// Switch statement - compiler forces you to handle all cases!
switch (currentStatus) {
case Status.idle:
print("Waiting...");
break;
case Status.loading:
print("Loading data...");
break;
case Status.success:
print("Done!");
break;
case Status.error:
print("Something went wrong!");
break;
}
Enhanced Enums - Dart 2.17’nin Hediyesi
Dart 2.17 ile enum’lar steroid’e başladı! Artık enum’lara field’lar, method’lar, constructor’lar ekleyebiliyorsunuz:
enum PaymentMethod {
cash(icon: "💵", fee: 0),
creditCard(icon: "💳", fee: 2.5),
paypal(icon: "🅿️", fee: 3.0);
final String icon;
final double fee;
const PaymentMethod({required this.icon, required this.fee});
// Method in enum!
double calculateTotal(double amount) {
return amount + (amount * fee / 100);
}
}
// Usage
final method = PaymentMethod.creditCard;
print("${method.icon} Fee: ${method.fee}%");
final total = method.calculateTotal(100); // 102.5
Real World Kullanım
API Response Handling: Enum’lar API durumlarını yönetmek için mükemmel. Network state, error types, response status… Hepsi enum olmalı.
Theme Management: Light/Dark theme yerine enum kullanın. Sonra kolayca blue theme, high contrast theme ekleyebilirsiniz.
Navigation: Route’larınızı enum’la tanımlayın. Typo yapmak imkansız hale gelir.
Form Validation: Validation error type’larını enum yapın. Her error için farklı mesaj göstermek kolaylaşır.
Pro Tips
-
Enum.values: Tüm enum değerlerini array olarak verir. Dropdown menu için ideal!
-
name property: Enum’un string representation’ı.
Status.loading.name→ “loading” -
index property: Enum’un sıra numarası. Database’e int olarak kaydetmek için kullanışlı.
-
Extension methods: Enum’lara extension yazarak güçlendirebilirsiniz.
Enum vs Sealed Class
Dart 3.0’da sealed class’lar geldi. Daha complex pattern matching istiyorsanız sealed class, basit case’ler için enum yeterli. Enum’lar daha lightweight ve readable.
Sonuç
Bir değer gerçekten kapalı bir seçenek kümesine sahipse enum, metin sabitlerinden daha açık ve güvenli bir model sunar. Her durum farklı veri taşıyorsa sealed class daha uygun olabilir. Seçimi framework alışkanlığına göre değil, durumların veri ve davranış gereksinimine göre yapmak gerekir.