CodeBlanks Logo Icon CodeBlanks

Özet - Provider

Provider, ChangeNotifier ve watch'ı birleştirerek tema yaparsın.

Özet - Provider

Bu bölümde üç şey öğrendin: Provider ile state'i ağaca sağlarsın; ChangeNotifier ile dinlenebilir model yapar ve notifyListeners ile değişikliği bildirirsin; context.watch ile modeli dinleyip rebuild tetiklersin.

final tema = context.watch<TemaModeli>();
Text(tema.karanlik ? 'Karanlık' : 'Aydınlık')

Bunları birleştirerek tema değiştirme ekranı yaparsın.

Uygulama Tema değiştirme ekranı yap

TemaModeli sınıfını ChangeNotifier'dan türet: karanlik bool ve degistir metodu olsun. ChangeNotifierProvider<TemaModeli> ile modeli sağla. Ekrani'de context.watch<TemaModeli>() ile temayı oku, butonda context.read<TemaModeli>().degistir() çağır. main içinde print('tema uygulaması') çağır.

Başlangıç kodu

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

void main() {
  print('tema uygulaması');
  runApp(MyApp());
}

// TemaModeli: ChangeNotifier, karanlik bool, degistir metodu

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // ChangeNotifierProvider ile TemaModeli sağla
    return MaterialApp(
      home: Ekrani(),
    );
  }
}

class Ekrani extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // context.watch ile temayı al
    return Scaffold(
      appBar: AppBar(title: Text('Tema')),
      body: Center(child: Text('?')),
      floatingActionButton: FloatingActionButton(
        // context.read ile degistir çağır
        onPressed: () {},
        child: Icon(Icons.lightbulb),
      ),
    );
  }
}

Örnek çözüm

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

void main() {
  print('tema uygulaması');
  runApp(MyApp());
}

class TemaModeli extends ChangeNotifier {
  bool karanlik = false;
  void degistir() {
    karanlik = !karanlik;
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<TemaModeli>(
      create: (_) => TemaModeli(),
      child: MaterialApp(
        home: Ekrani(),
      ),
    );
  }
}

class Ekrani extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final tema = context.watch<TemaModeli>();
    return Scaffold(
      appBar: AppBar(title: Text('Tema')),
      body: Center(child: Text(tema.karanlik ? 'Karanlık' : 'Aydınlık')),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<TemaModeli>().degistir(),
        child: Icon(Icons.lightbulb),
      ),
    );
  }
}

Beklenen çıktı

tema uygulaması

Soru ve cevaplar

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

1 Tema değiştirme uygulamasında model hangi sınıftan türetilmeli?

  • ChangeNotifier Doğru cevap
  • StatelessWidget
  • StatefulWidget
  • InheritedWidget

Açıklama: Tema modeli ChangeNotifier'dan türetilir; degistir metodu karanlik değerini tersine çevirip notifyListeners ile dinleyicileri bilgilendirir.

2 TemaModeli'ni ChangeNotifier'dan türet

Soru
class TemaModeli ____ {
  bool karanlik = false;
  void degistir() {
    karanlik = !karanlik;
    notifyListeners();
  }
}
Cevap
class TemaModeli extends ChangeNotifier {
  bool karanlik = false;
  void degistir() {
    karanlik = !karanlik;
    notifyListeners();
  }
}

Açıklama: TemaModeli, ChangeNotifier'dan extends ile türetilir; böylece notifyListeners çağrılabilir ve dinleyiciler bilgilendirilebilir.

3 Provider bölümünün parçaları

Kavram Anlamı
Provider State'i ağaca sağlayan paket
ChangeNotifier Değişiklik bildirimi yapan model sınıfı
notifyListeners Dinleyen widget'ları yeniden inşa eder
context.watch Modeli dinleyip rebuild tetikler

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