Merhaba arkadaşlar! Bugün Dart’ın en sevdiğim özelliklerinden biri olan enum’ları konuşacağız. Flutter’da state management yaparken, API response handling’de, ya da sadece kodunuzu daha güvenli hale getirmek istediğinizde enum’lar hayat kurtarıcı oluyor.
Enum Nedir? Problem Ne?
String’lerle status check yapmaktan bıktınız mı? if (status == "loading") yazarken “loading” mı “Loading” mi diye düşünmekten yoruldunuz mu? İşte enum’lar tam bu sorunu çözüyor.
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ç
Enum’lar küçük görünebilir ama code quality’ye katkıları devasa. Type safety sağlıyorlar, bug’ları compile time’da yakalıyorlar, kodunuzu self-documenting yapıyorlar.
Benim kuralım basit: Eğer bir değişken sınırlı sayıda değer alabiliyorsa, enum yapın. String constant’lar yerine enum kullanın. Kodunuz hem daha güvenli hem daha okunabilir olacak.
Flutter’da state management yapıyorsanız enum’sız olmaz. Bloc pattern’de event’ler ve state’ler, Riverpod’da AsyncValue state’leri… Hepsi enum kullanıyor.