CodeBlanks Logo Icon CodeBlanks

context.watch ve read

context.watch ve context.read arasındaki farkı öğrenirsin.

context.watch

context.watch<T>() sağlanan modeli dinler ve notifyListeners çağrıldığında widget'ı otomatik yeniden inşa eder. Build metodu içinde kullanılır.

final model = context.watch<SayacModeli>();
Text('${model.deger}')

Her değişiklikte build yeniden çalışır.

context.read

context.read<T>() modeli dinlemeden bir kez okur. notifyListeners çağrılsa bile rebuild tetiklemez. Buton callback'leri gibi build dışı yerlerde kullanılır.

onPressed: () {
  context.read<SayacModeli>().artir();
}

read, watch'tan farklı olarak build'i tetiklemez.

Uygulama watch ile dinle, read ile çağır

Ekrani'de context.watch<SayacModeli>() ile modeli al ve deger'i göster. Butona basıldığında context.read<SayacModeli>().artir() çağır. main içinde print('ekran hazır') çağır.

Başlangıç kodu

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

void main() {
  print('ekran hazır');
  runApp(MyApp());
}

class SayacModeli extends ChangeNotifier {
  int deger = 0;
  void artir() {
    deger++;
    notifyListeners();
  }
}

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

class Ekrani extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // modeli watch ile dinle, butonu read ile bağla
    return Scaffold(
      body: Center(child: Text('?')),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: Icon(Icons.add),
      ),
    );
  }
}

Örnek çözüm

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

void main() {
  print('ekran hazır');
  runApp(MyApp());
}

class SayacModeli extends ChangeNotifier {
  int deger = 0;
  void artir() {
    deger++;
    notifyListeners();
  }
}

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

class Ekrani extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final model = context.watch<SayacModeli>();
    return Scaffold(
      body: Center(child: Text('${model.deger}')),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read<SayacModeli>().artir();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

Beklenen çıktı

ekran hazır

Soru ve cevaplar

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

1 context.watch ile context.read arasındaki fark nedir?

  • watch yalnızca initState'te kullanılır
  • İkisi de tamamen aynıdır
  • watch dinler ve rebuild eder, read yalnızca bir kez okur Doğru cevap
  • read rebuild eder, watch yalnızca okur

Açıklama: context.watch modeli dinler ve değişiklikte rebuild tetikler; context.read yalnızca bir kez okur ve dinlemez.

2 Buton içinde modeli bir kez oku

Soru
onPressed: () {
  context.____<SayacModeli>().artir();
}
Cevap
onPressed: () {
  context.read<SayacModeli>().artir();
}

Açıklama: Buton callback'inde rebuild istenmediği için context.read kullanılır; bu modeli bir kez okur ve dinlemez.

3 watch ve read parçaları

Kavram Anlamı
context.watch Değişiklikte rebuild tetikler
context.read Bir kez okur, dinlemez
build metodu watch'ın kullanıldığı yer
onPressed read'in kullanılabileceği yer

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