Flutter İle Karanlık Mod Desteği Nasıl Yapılır?

Flutter İle Karanlık Mod Desteği Nasıl Yapılır?
Flutter İle Karanlık Mod Desteği Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberi uygulamak için bilgisayarınızda Flutter SDK'nın 3.24 veya daha yeni bir sürümünün yüklü olması önerilir. 2026 yılı standartları gereği, Material 3 (M3) tasarım dilini varsayılan olarak kullanacağız. Projenizi oluştururken terminalde flutter create proje_adi komutunu kullanabilirsiniz.

  • Flutter SDK 3.24+
  • Dart 3.5+
  • IDE: VS Code veya Android Studio (Flutter eklentileri kurulu)
  • Temel düzeyde State Management bilgisi

Adım 1: MaterialApp İçerisinde Tema Yapılandırması

Uygulamanın tema yönetim merkezi MaterialApp widget'ıdır. Burada hem aydınlık (light) hem de karanlık (dark) mod için ayrı ThemeData nesneleri tanımlarız. Aşağıdaki örnek, uygulamanızın temel tema ayarlarını nasıl yapılandıracağınızı gösterir.


MaterialApp(
  title: 'Karanlık Mod Uygulaması',
  theme: ThemeData(
    useMaterial3: true,
    brightness: Brightness.light,
    colorSchemeSeed: Colors.blue,
  ),
  darkTheme: ThemeData(
    useMaterial3: true,
    brightness: Brightness.dark,
    colorSchemeSeed: Colors.blue,
  ),
  themeMode: ThemeMode.system, // Sistem ayarlarını takip et
  home: const AnaSayfa(),
);

Burada themeMode parametresi kritik öneme sahiptir. ThemeMode.system seçeneği, cihazın kendi ayarlarındaki karanlık/aydınlık tercihini otomatik olarak algılar ve uygular.

Adım 2: Renk Şemalarını Özelleştirme

Varsayılan temalar bazen kurumsal kimliğinize uyum sağlamayabilir. ColorScheme nesnesini kullanarak, karanlık modda görünmesini istediğiniz özel renkleri tanımlayabilirsiniz. Bu yöntem, uygulamanın kontrast oranlarını koruyarak erişilebilirliği artırır.


final lightTheme = ThemeData(
  colorScheme: ColorScheme.fromSeed(
    seedColor: Colors.deepPurple,
    brightness: Brightness.light,
  ),
);

final darkTheme = ThemeData(
  colorScheme: ColorScheme.fromSeed(
    seedColor: Colors.deepPurple,
    brightness: Brightness.dark,
  ),
);

Bu yaklaşım, tüm widget'larınızın renklerini otomatik olarak seçilen seedColor üzerinden hesaplar ve tutarlı bir görsel dil oluşturur.

Adım 3: Kullanıcı Tercihini Yönetme (State Management)

Sistem ayarlarından bağımsız olarak, kullanıcıya uygulama içi bir "Karanlık Modu Aç/Kapat" seçeneği sunmak isteyebilirsiniz. Bunun için ChangeNotifier kullanarak basit bir tema sağlayıcı oluşturmak en verimli yoldur.


class TemaDegistirici extends ChangeNotifier {
  ThemeMode _themeMode = ThemeMode.system;

  ThemeMode get themeMode => _themeMode;

  void temaDegistir(bool isDark) {
    _themeMode = isDark ? ThemeMode.dark : ThemeMode.light;
    notifyListeners();
  }
}

Bu sınıf, uygulamanın herhangi bir yerinden tema değişikliğini tetiklememize ve tüm ekranların anlık olarak güncellenmesini sağlamamıza olanak tanır.

Adım 4: Widget'larda Tema Kullanımı

Kodunuz içerisinde sabit renkler kullanmak yerine Theme.of(context) yapısını kullanmalısınız. Bu, temanız değiştiğinde widget'larınızın otomatik olarak renk değiştirmesini sağlar. Sabit renkler kullanmak, karanlık modun düzgün çalışmasını engelleyen en yaygın hatadır.


Container(
  color: Theme.of(context).colorScheme.surface,
  child: Text(
    'Merhaba Dünya',
    style: TextStyle(
      color: Theme.of(context).colorScheme.onSurface,
    ),
  ),
);

Yukarıdaki örnekte surface arka planı, onSurface ise metin rengini temsil eder. Bu, Material Design prensiplerine göre en güvenli renk eşleşmesidir.

Tema Yönetim Yöntemleri Karşılaştırması

Yöntem Avantaj Dezavantaj
ThemeMode.system Otomatik ve hızlı kurulum Kullanıcı kontrolü kısıtlı
Provider/Riverpod Tam kontrol, kalıcı ayarlar Ekstra kod maliyeti
Sabit Renkler Hızlı prototipleme Tema desteği imkansız

Adım 5: Karanlık Modda Güvenlik ve Uyarılar

Kritik Uyarı: Uygulamanızda karanlık mod desteği sunarken, kullanıcı verilerini yerel depolama (SharedPreferences veya Hive) üzerinde tutuyorsanız, bu verilerin şifrelenmiş olduğundan emin olun. Ayrıca, kontrast oranlarını (WCAG standartları) kontrol etmek için Flutter'ın sunduğu AccessibilityTools paketini kullanmayı ihmal etmeyin.

Uygulamanızda kullanıcı tercihlerini saklarken flutter_secure_storage gibi kütüphaneler kullanarak, tema ayarlarının güvenli bir şekilde kalıcı olmasını sağlayabilirsiniz.


// Tercihi kaydetme örneği
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isDarkMode', true);

Sıkça Sorulan Sorular

Karanlık modda resimlerin parlaklığını nasıl ayarlarım?

Resimleriniz için ColorFiltered widget'ını kullanarak karanlık modda resmin opaklığını veya doygunluğunu azaltabilirsiniz.

Neden bazı widget'larım tema değişince güncellenmiyor?

Bunun sebebi genellikle Theme.of(context) yerine sabit renk kodları (Hex) kullanmanızdır. Tüm renkleri ThemeData üzerinden çekmelisiniz.

Sistem ayarı değiştiğinde uygulama yeniden mi başlıyor?

Hayır, Flutter'ın MaterialApp widget'ı, tema verisi değiştiğinde tüm alt ağacı (widget tree) yeniden oluşturur (rebuild), bu da kesintisiz bir geçiş sağlar.

Karanlık mod için özel bir ikon setine ihtiyacım var mı?

Hayır, Icons kütüphanesindeki ikonlar otomatik olarak onSurface rengini alır, bu yüzden ekstra bir işleme gerek yoktur.

Karanlık modda pil tasarrufu gerçekten sağlanıyor mu?

Evet, özellikle OLED ekranlarda siyah pikseller kapalı olduğu için ciddi oranda enerji tasarrufu sağlanır.

İleri Düzey İpucu: Dinamik Tema Geçişlerinde Animasyon Kullanımı

Kullanıcılar tema değiştirdiğinde, sert bir geçiş yerine yumuşak bir animasyon deneyimi, uygulamanızın kalite algısını doğrudan artırır. Flutter'ın yerleşik Theme widget'ı, tema geçişlerini otomatik olarak animasyonlu hale getirmez. Bunu başarmak için AnimatedTheme widget'ını kullanabilir veya özel bir geçiş efekti tanımlayabilirsiniz.

Aşağıdaki örnek, uygulama genelinde tema değişirken renklerin belirli bir süre içerisinde yumuşakça geçiş yapmasını sağlar:


AnimatedTheme(
  data: isDarkMode ? ThemeData.dark() : ThemeData.light(),
  duration: Duration(milliseconds: 500),
  curve: Curves.easeInOut,
  child: Scaffold(
    body: Center(child: Text("Yumuşak Geçişli Tema")),
  ),
)

Karanlık Modda Performans ve Hata Ayıklama (Debugging)

Karanlık mod geliştirirken en sık karşılaşılan hatalardan biri, "hard-coded" (sabit kodlanmış) renklerin kullanılmasıdır. Eğer bir widget içerisinde Colors.black veya Colors.white değerlerini doğrudan kullanırsanız, tema değiştiğinde bu renkler güncellenmeyecek ve kullanıcı arayüzünde okunabilirlik sorunları oluşacaktır.

Hata Ayıklama Stratejileri

  • Renk Kontrolü: Uygulamanızda Colors.black veya Colors.white araması yaparak, bunların yerine Theme.of(context).colorScheme.surface veya Theme.of(context).colorScheme.onSurface gibi dinamik referanslar kullanıldığından emin olun.
  • DevTools Kullanımı: Flutter DevTools içerisindeki "Inspector" aracını kullanarak, seçili bir widget'ın hangi tema değerlerini aldığını canlı olarak inceleyin.
  • Erişilebilirlik Testi: Karanlık modda metinlerin arka planla olan kontrast oranını (WCAG standartlarına göre en az 4.5:1) kontrol edin. Düşük kontrast, görme engelli kullanıcılar için ciddi bir engeldir.

Performans İpuçları

Tema değişiklikleri sırasında tüm ağaç yapısının (widget tree) yeniden oluşturulması bazen performans kaybına yol açabilir. Bunu engellemek için:

  1. Const Kullanımı: Tema bağımlılığı olmayan statik widget'larınızı const olarak tanımlayın. Bu, Flutter'ın yeniden oluşturma (rebuild) aşamasında bu widget'ları atlamasını sağlar.
  2. RepaintBoundary: Çok karmaşık çizimler içeren ekranlarda, tema değiştiğinde yeniden boyanmasını istemediğiniz alanları RepaintBoundary widget'ı ile sararak performans optimizasyonu yapın.
Sorun Çözüm
Sabit renk kullanımı Theme.of(context) kullanarak dinamik atama yapın.
Yavaş geçişler AnimatedTheme ile geçiş süresini optimize edin.
Okunamayan metinler ColorScheme içerisinde onSurface değerlerini doğru yapılandırın.

Sonuç

Flutter ile karanlık mod desteği eklemek, sadece estetik bir dokunuş değil, aynı zamanda kullanıcı dostu ve profesyonel bir uygulama geliştirmenin temel taşıdır. Bu rehberde öğrendiğiniz ThemeData yapılandırması, ColorScheme kullanımı ve ThemeMode yönetimi ile uygulamanızı 2026 standartlarına uygun hale getirebilirsiniz. Bir sonraki adım olarak, uygulamanızın renk paletini FlexColorScheme gibi kütüphanelerle daha da zenginleştirmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri genel eğitim amaçlıdır. Uygulamanızın üretim ortamına (production) taşınmadan önce tüm erişilebilirlik ve performans testlerinden geçtiğinden emin olun. Yazılım güvenliği sorumluluğu geliştiriciye aittir.

Bu yazıya tepkinizi paylaşın:
Pelin Aydın

Kullanıcı deneyimi odaklı içerik stratejileri geliştiriyorum. Pratik bilgi arayan okuyucular için en hızlı ve etkili yöntemleri içeren rehberler hazırlıyorum.

Yorumlar (16)

16
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Ayşegül B.
Ayşegül B. 12 Temmuz 2026

Material 3 geçişi ile ilgili çok fazla kaynak yoktu, iyi oldu bu yazı. Devamını bekliyoruz.

Oğuzhan K.
Oğuzhan K. 18 Temmuz 2026

Kodlar da temizmiş, eline sağlık. Baya faydalı oldu saol.

Selin Yılmaz
Selin Yılmaz 22 Temmuz 2026

Harika özet olmuş, hemen projeme ekliyorum.

Hakan Demir
Hakan Demir 24 Temmuz 2026

Kesinlikle katılıyorum, en sade anlatımı bu blogda buldum.

Gökhan E.
Gökhan E. 26 Temmuz 2026

Pelin Hanım, GetX kullanırken de bu yöntem geçerli mi yoksa GetThemeMode mu kullanmak daha sağlıklı olur?

Pelin Aydın
Pelin Aydın 27 Temmuz 2026

GetX kendi içinde tema yönetimini barındırıyor, bu yazdığım yöntem saf Flutter/Provider veya Bloc kullananlar için daha uygun.

Fatma Nur
Fatma Nur 28 Temmuz 2026

Flutter'da dark mode yaparken hep renk paletlerinde sorun yaşıyodum, bu yazıyla sonunda hallettim. Teşekkürler!

Selim Arda
Selim Arda 30 Temmuz 2026

Bi tık karışık anlatılmış sanki, yeni başlayanlar için zor olabilir ama genel olarak faydalı.

Pelin Aydın
Pelin Aydın 31 Temmuz 2026

Geri bildirimin için teşekkürler Selim. Bir sonraki yazıda daha temel seviye bir giriş yapmayı denerim.

Burak Çelik
Burak Çelik 30 Temmuz 2026

Çok açıklayıcı olmuş, emeğine sağlık. Özellikle sistem ayarlarıyla senkronize olma kısmı hayat kurtarıcı.

Mertcan Özdemir
Mertcan Özdemir 01 Ağustos 2026

İyi anlatım olmuş. Peki sadece belirli sayfalarda karanlık mod olsun istersek ne yapmalıyız? Onu da bi anlatsan efsane olur.

Deniz Kara
Deniz Kara 02 Ağustos 2026

Aynen, ben de bunu merak ediyorum, genel tema yerine sayfa bazlı kontrol nasıl olur acaba?

Zeynep S.
Zeynep S. 03 Ağustos 2026

Ya ben kodları denedim ama themeMode kısmında hata alıyom, bi türlü çözemedim. Yardımcı olur musun?

Pelin Aydın
Pelin Aydın 04 Ağustos 2026

Muhtemelen MaterialApp içindeki themeMode parametresini tetikleyen bir state yönetimi eksikliği olabilir. Gist linki paylaşırsan bakabilirim.

Caner Yıldız
Caner Yıldız 05 Ağustos 2026

Eline sağlık Pelin, Material 3 ile tema geçişleri gerçekten çok akıcı oldu. Tam aradığım rehberdi.

Pelin Aydın
Pelin Aydın 06 Ağustos 2026

Çok teşekkürler Caner, Material 3'ün sunduğu renk paletleri gerçekten işleri çok kolaylaştırıyor.

Yorum Yaz