Menu
CoddyTech

Provider: Watch veya Read

Coddy'nin Flutter Journey'sinin Durum Yönetimi bölümünün bir parçası. Ders 11 / 27.

Provider'dan model almanın iki yolu vardır ve farklı işler yaparlar.

context.watch<StepCounter>() modeli alır ve ona abone olur: model notifyListeners() çağırdığında bu bileşen yeniden oluşturulur. Ekranda gösterilen her şey için build içinde kullanın.

context.read<StepCounter>() modeli abonelik olmadan bir kez alır. Bir yöntemi çağırmak ve herhangi bir şey göstermemek istediğiniz onPressed gibi geri çağırımlarda kullanın:

Widget build(BuildContext context) {
  final steps = context.watch<StepCounter>().steps;   // gösterir
  return ElevatedButton(
    onPressed: () => context.read<StepCounter>().walk(),   // eyleme geçer
    child: Text('$steps steps'),
  );
}

Bu ikisini karıştırırsanız sonucu görürsünüz. build içinde read kullanmak ilk değeri sonsuza dek gösterir. onPressed içinde watch kullanmak hatadır; çünkü dokunma bir oluşturma işlemi değildir ve abone olunacak bir şey yoktur.

challenge icon

Görev

Kolay

Walk modele 1000 adım ekliyor, ancak ekranda hâlâ 0 steps görünüyor.

  • Her dokunuşta yeni sayı görünecek şekilde adım satırının modeli izlemesini sağlayın.
  • Düğmenin çağrısını olduğu gibi bırakın.

Kendin dene

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

class StepCounter extends ChangeNotifier {
  int _steps = 0;

  int get steps => _steps;

  void walk() {
    _steps += 1000;
    notifyListeners();
  }
}

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => StepCounter(),
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    final steps = context.read<StepCounter>().steps;
    return Scaffold(
      appBar: AppBar(title: const Text('Steps')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('$steps steps', style: const TextStyle(fontSize: 40)),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                context.read<StepCounter>().walk();
              },
              child: const Text('Walk'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Durum Yönetimi bölümündeki tüm dersler

Kendi başına pratik yap: Online Flutter derleyicisi