Getters dans vos classes
Fait partie de la section Gestion d’état du Journey Flutter de Coddy. Leçon 6 sur 27.
Certaines valeurs n’ont pas besoin d’être stockées, car elles découlent d’autres valeurs. Le nombre de verres restants correspond à l’objectif moins le nombre de verres déjà bus. Un accesseur calcule cette valeur chaque fois que tu la demandes :
class WaterLog {
int glasses = 0;
int goal = 8;
int get left => goal - glasses;
bool get done => glasses >= goal;
}Un accesseur a un type, le mot get et un nom, sans parenthèses. => signifie « le résultat est ». Tu le lis comme un champ : log.left, jamais log.left().
Un champ conserverait le nombre tel qu’il était au moment où il a été défini. Un accesseur est recalculé à chaque lecture, il n’est donc jamais obsolète : bois un verre et log.left aura diminué de un lors de la prochaine reconstruction.
Défi
FacileLa page effectue elle-même le calcul et, une fois l’objectif atteint, le décompte passe en dessous de zéro. Déplace les règles dans WaterLog :
- Ajoute un accesseur
left: l’objectif moins le nombre de verres. - Ajoute un accesseur
done:trueune fois que le nombre de verres atteint l’objectif. - Affiche
Goal reached!lorsquelog.doneest vrai, et sinon8 to go,7 to go, et ainsi de suite à partir delog.left.
Essayez vous-même
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class WaterLog {
int glasses = 0;
int goal = 8;
void drink() {
glasses = glasses + 1;
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final log = WaterLog();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Water')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'${log.goal - log.glasses} to go',
style: const TextStyle(fontSize: 32),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
setState(() {
log.drink();
});
},
child: const Text('Drink a glass'),
),
],
),
),
);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Gestion d’état
2Dart pour les modèles
Méthodes dans vos classesGetters dans vos classesGarder un champ privéAdditionner une liste avec foldEntraînez-vous par vous-même : Compilateur Flutter en ligne