Menu
CoddyTech

Getters en tus clases

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

Algunos valores no necesitan almacenarse, porque se derivan de otros. La cantidad de vasos que quedan es la meta menos los vasos que llevas. Un getter lo calcula cada vez que lo consultas:

class WaterLog {
  int glasses = 0;
  int goal = 8;

  int get left => goal - glasses;
  bool get done => glasses >= goal;
}

Un getter tiene un tipo, la palabra get y un nombre, sin paréntesis. => significa «el resultado es». Se lee como un campo: log.left, nunca log.left().

Un campo conservaría el número desde el momento en que se asignó. Un getter se vuelve a calcular en cada lectura, así que nunca queda desactualizado: bebe un vaso y log.left será uno menos en la siguiente compilación.

challenge icon

Desafío

Fácil

La página hace los cálculos por sí sola y, una vez alcanzada la meta, el contador queda por debajo de cero. Traslada las reglas a WaterLog:

  • Añade un getter left: la meta menos los vasos.
  • Añade un getter done: true una vez que los vasos alcanzan la meta.
  • Muestra Goal reached! cuando log.done sea verdadero y, de lo contrario, 8 to go, 7 to go, y así sucesivamente, a partir de log.left.

Pruébalo tú mismo

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'),
            ),
          ],
        ),
      ),
    );
  }
}
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