Menu
CoddyTech

Mantén un campo privado

Parte de la sección Gestión del estado del Journey de Flutter de Coddy. Lección 7 de 27.

Un termostato nunca debería superar los 26 grados ni bajar de los 16. Un método warmer puede comprobarlo, pero solo si nadie puede cambiar el número de otra manera. Mientras el campo sea público, cualquier código puede escribir thermostat.degrees = 99.

Un nombre que empieza por _ es privado: solo el código del mismo archivo puede usarlo. Pon la clase en su propio archivo, haz que el campo sea privado y proporciona un getter para que se pueda leer desde fuera, además de métodos para cambiarlo:

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

  int get degrees => _degrees;

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

La página importa el archivo con import 'thermostat.dart';. Puede leer thermostat.degrees, pero thermostat.degrees++ ya no se compila: hay un getter, pero no hay forma de asignarle un valor. La única manera de cambiar los grados es mediante los métodos, así que siempre se respetan los límites.

Abre thermostat.dart en la lista de archivos para editarlo.

challenge icon

Desafío

Intermedio

Los botones cambian degrees directamente desde la página, sin límites. En thermostat.dart:

  • Cambia el nombre del campo a _degrees y añade un getter degrees que lo devuelva.
  • Añade warmer(), que suma 1 hasta llegar a 26, y cooler(), que resta 1 hasta llegar a 16.

Después, haz que los botones de main.dart llamen a thermostat.warmer() y thermostat.cooler().

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Gestión del estado

Practica por tu cuenta: Compilador de Flutter online