CodeBlanks Logo Icon CodeBlanks

Meydan okuma 1

Provider ile tema yönetimi yapan bir uygulama yaparsın.

Provider ile tema yönetimi

Bu meydan okumada Provider ve ChangeNotifier ile uygulama geneli tema yönetimi yaparsın. Bir TemaProvider sınıfı ChangeNotifier'ı extend eder; brightness değiştiğinde notifyListeners() çağrılır. MaterialApp'ın theme ve darkTheme alanları provider'dan okunur, themeMode da provider tarafından belirlenir.

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

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

Bu yapı, tema değişiminde tüm uygulamayı yeniden çizer.

Uygulama TemaProvider sınıfı

TemaProvider adında bir sınıf tanımla; ChangeNotifier'ı extend etsin. _mode adında ThemeMode.light başlangıç değerli bir özel alan olsun ve mode getter'ı bunu döndürsün. degistir metodu modu light ise dark, dark ise light yapsın ve notifyListeners() çağırsın. main içinde provider örneği oluşturup mode değerini yazdır.

Başlangıç kodu

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

// TemaProvider sınıfını tanımla
// ChangeNotifier'ı extend etsin
// _mode alanı ThemeMode.light ile başlasın
// mode getter'ı _mode döndürsün
// degistir metodu modu değiştirsin ve dinleyicileri haberdar etsin

void main() {
  // provider oluştur ve mode değerini yazdır
}

Örnek çözüm

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

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

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

void main() {
  final p = TemaProvider();
  print(p.mode);
}

Beklenen çıktı

ThemeMode.light

Uygulama Tema değişimi sonucu

main içinde bir TemaProvider oluştur. degistir() metodunu çağır ve yeni mode değerini print ile yazdır.

Başlangıç kodu

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

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

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

// main içinde provider oluştur
// degistir metodunu çağır
// yeni mode değerini yazdır

Örnek çözüm

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

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

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

void main() {
  final p = TemaProvider();
  p.degistir();
  print(p.mode);
}

Beklenen çıktı

ThemeMode.dark

Soru ve cevaplar

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

1 TemaProvider'da mode değiştiğinde ne çağrılır?

  • notifyListeners Doğru cevap
  • Navigator.pop
  • jsonDecode
  • setState

Açıklama: ChangeNotifier'da değişiklikleri dinleyenleri haberdar etmek için notifyListeners çağrılır. setState StatefulWidget içindir, Navigator.pop yönlendirme içindir, jsonDecode JSON çözmek içindir; bunlar Provider akışında yer almaz.

2 ChangeNotifier'ı extend et

Soru
class TemaProvider extends ____ {
  ThemeMode _mode = ThemeMode.light;
  ThemeMode get mode => _mode;

  void degistir() {
    _mode = _mode == ThemeMode.light ? ThemeMode.dark : ThemeMode.light;
    notifyListeners();
  }
}
Cevap
class TemaProvider extends ChangeNotifier {
  ThemeMode _mode = ThemeMode.light;
  ThemeMode get mode => _mode;

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

Açıklama: TemaProvider ChangeNotifier'ı extend eder; böylece notifyListeners ile dinleyicileri güncelleyebilir. State StatefulWidget içindir, FutureBuilder async arayüz içindir, Tween değer geçişidir; tema yönetiminde kullanılmazlar.

3 Provider ile tema parçaları

Kavram Anlamı
ChangeNotifier dinleyicileri haberdar etme
notifyListeners değişiklik bildirimi
ThemeMode tema modu
MaterialApp.theme uygulama teması

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