Menu
CoddyTech

Getters nas suas classes

Parte da seção Gerenciamento de estado do Journey de Flutter da Coddy. Lição 6 de 27.

Alguns valores não precisam ser armazenados, porque podem ser deduzidos de outros. A quantidade de copos que restam é a meta menos os copos consumidos até agora. Um getter calcula esse valor cada vez que você pergunta:

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

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

Um getter tem um tipo, a palavra get e um nome, sem parênteses. => significa "o resultado é". Você o acessa como um campo: log.left, nunca log.left().

Um campo manteria o número definido no momento em que foi atribuído. Um getter é recalculado a cada leitura, então nunca fica desatualizado: beba um copo e log.left será um a menos na próxima compilação.

challenge icon

Desafio

Fácil

A página faz as contas por conta própria e, quando a meta é atingida, a contagem fica abaixo de zero. Mova as regras para WaterLog:

  • Adicione um getter left: a meta menos os copos.
  • Adicione um getter done: true quando a quantidade de copos atingir a meta.
  • Exiba Goal reached! quando log.done for verdadeiro e, caso contrário, 8 to go, 7 to go e assim por diante, usando log.left.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Gerenciamento de estado

Pratique por conta própria: Compilador de Flutter online