CodeBlanks Logo Icon CodeBlanks

Tema değiştirme

Çok temalı uygulamayı canlı değiştirmeyi öğrenirsin.

Çok temalı uygulama

Çok temalı uygulamada ThemeData'yı state içinde tutarsın. Kullanıcı temasını değiştirdiğinde state güncellenir ve MaterialApp yeniden derlenir. ChangeNotifier ile bu değişimi tüm uygulamaya yayarsın.

class ThemeModeNotifier extends ChangeNotifier {
  ThemeMode _mode = ThemeMode.light;
  ThemeMode get mode => _mode;

  void toggle() {
    _mode = _mode == ThemeMode.light
        ? ThemeMode.dark
        : ThemeMode.light;
    notifyListeners();
  }
}

Provider ile tema yönetimi

ChangeNotifierProvider ile tema state'ini uygulama geneline yayarsın. Consumer ile tema değişikliğini dinler ve MaterialApp'i yeni themeMode ile yeniden derlersin.

ChangeNotifierProvider(
  create: (_) => ThemeModeNotifier(),
  child: Consumer<ThemeModeNotifier>(
    builder: (context, notifier, _) => MaterialApp(
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      themeMode: notifier.mode,
      home: const HomeScreen(),
    ),
  ),
);

Uygulama Tema controller yaz

ThemeController adında ChangeNotifier yaz. _isDark adında bool alanı başlangıçta false olsun, isDark getter'ı ile dışarı açılsın. toggle metodu değeri tersine çevirip dinleyicileri uyarsın. main içinde oluştur, toggle çağır, isDark yazdır.

Başlangıç kodu

main.dart
import 'package:flutter/material.dart';

// ThemeController: ChangeNotifier tabanlı
// isDark: bool, başlangıçta false
// toggle(): değeri tersine çevir ve dinleyicileri uyar
// main: oluştur, toggle çağır, isDark yazdır

void main() {
}

Örnek çözüm

main.dart
import 'package:flutter/material.dart';

class ThemeController extends ChangeNotifier {
  bool _isDark = false;
  bool get isDark => _isDark;

  void toggle() {
    _isDark = !_isDark;
    notifyListeners();
  }
}

void main() {
  final controller = ThemeController();
  controller.toggle();
  print(controller.isDark);
}

Beklenen çıktı

true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 ChangeNotifier ile tema değişikliğini dinleyicilere bildiren metod hangisi?

  • build
  • updateListeners
  • notifyListeners Doğru cevap
  • setState

Açıklama: notifyListeners, ChangeNotifier'daki değişikliği tüm dinleyen widget'lara bildirir; Consumer ve context.watch bu sinyali dinler.

2 Toggle metodu

Soru
void toggle() {
  _mode = (_mode == ThemeMode.light) ? ThemeMode.dark : ____;
  notifyListeners();
}
Cevap
void toggle() {
  _mode = (_mode == ThemeMode.light) ? ThemeMode.dark : ThemeMode.light;
  notifyListeners();
}

Açıklama: toggle, light ve dark arasında geçiş yapar; dark ise light'a döner.

3 Tema değiştirme parçaları

Kavram Anlamı
ChangeNotifier State değişikliğini bildirir
notifyListeners Dinleyicileri uyarır
Consumer State'i dinleyen widget
themeMode Aktif tema seçimi

Uzman seviye bölümündeki tüm dersler