Menu
CoddyTech

Mantenha um campo privado

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

Um termostato nunca deve ultrapassar 26 nem ficar abaixo de 16 graus. Um método warmer pode verificar isso, mas somente se ninguém puder alterar o número de outra maneira. Enquanto o campo for público, qualquer código pode escrever thermostat.degrees = 99.

Um nome que começa com _ é privado: somente o código no mesmo arquivo pode usá-lo. Coloque a classe em seu próprio arquivo, torne o campo privado e forneça ao código externo um getter para lê-lo e métodos para alterá-lo:

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

  int get degrees => _degrees;

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

A página importa o arquivo com import 'thermostat.dart';. Ela pode ler thermostat.degrees, mas thermostat.degrees++ não compila mais: há um getter e nenhuma maneira de definir o valor. A única maneira de alterar os graus é por meio dos métodos, então os limites são sempre respeitados.

Abra thermostat.dart na lista de arquivos para editá-lo.

challenge icon

Desafio

Médio

Os botões alteram degrees diretamente na página, sem limites. Em thermostat.dart:

  • Renomeie o campo para _degrees e adicione um getter degrees que o retorne.
  • Adicione warmer(), que aumenta o valor em 1 até 26, e cooler(), que diminui o valor em 1 até 16.

Depois, faça os botões em main.dart chamarem thermostat.warmer() e thermostat.cooler().

Experimente você mesmo

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 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