Menu
CoddyTech

Garder un champ privé

Fait partie de la section Gestion d’état du Journey Flutter de Coddy. Leçon 7 sur 27.

Un thermostat ne doit jamais dépasser 26 degrés ni descendre en dessous de 16 degrés. Une méthode warmer peut vérifier cela, mais seulement si personne ne peut modifier le nombre autrement. Tant que le champ est public, n’importe quel code peut écrire thermostat.degrees = 99.

Un nom qui commence par _ est privé : seul le code du même fichier peut l’utiliser. Place la classe dans son propre fichier, rends le champ privé et donne à l’extérieur un accesseur pour le lire ainsi que des méthodes pour le modifier :

// thermostat.dart
class Thermostat {
  int _degrees = 20;

  int get degrees => _degrees;

  void warmer() {
    if (_degrees < 26) {
      _degrees = _degrees + 1;
    }
  }
}

La page importe le fichier avec import 'thermostat.dart';. Elle peut lire thermostat.degrees, mais thermostat.degrees++ ne compile plus : il y a un accesseur en lecture, mais aucun moyen de définir sa valeur. Le seul moyen de modifier les degrés est de passer par les méthodes, les limites sont donc toujours respectées.

Ouvre thermostat.dart dans la liste des fichiers pour le modifier.

challenge icon

Défi

Moyen

Les boutons modifient directement degrees depuis la page, sans aucune limite. Dans thermostat.dart :

  • Renomme le champ en _degrees et ajoute un accesseur degrees qui le renvoie.
  • Ajoute warmer(), qui augmente la valeur de 1 jusqu’à 26, et cooler(), qui la diminue de 1 jusqu’à 16.

Fais ensuite en sorte que les boutons dans main.dart appellent thermostat.warmer() et thermostat.cooler().

Essayez vous-même

import 'package:flutter/material.dart';

import 'thermostat.dart';

void main() {
  runApp(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 StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final thermostat = Thermostat();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Thermostat')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('${thermostat.degrees}°C', style: const TextStyle(fontSize: 48)),
            const SizedBox(height: 16),
            Row(
              mainAxisSize: MainAxisSize.min,
              children: [
                ElevatedButton(
                  onPressed: () {
                    setState(() {
                      thermostat.degrees--;
                    });
                  },
                  child: const Text('Cooler'),
                ),
                const SizedBox(width: 16),
                ElevatedButton(
                  onPressed: () {
                    setState(() {
                      thermostat.degrees++;
                    });
                  },
                  child: const Text('Warmer'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Flutter en ligne