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.
Görev
KolayWalk 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'),
),
],
),
),
);
}
}
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