Menu
CoddyTech

Геттеры в ваших классах

Часть раздела Управление состоянием путешествия по Flutter на Coddy. Урок 6 из 27.

Некоторые значения не нужно хранить, потому что их можно вычислить на основе других. Количество оставшихся стаканов — это цель минус количество уже выпитых стаканов. Геттер вычисляет это каждый раз, когда вы его запрашиваете:

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

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

У геттера есть тип, слово get и имя, но нет скобок. => означает «результат — это». Его используют как поле: log.left, никогда не log.left().

Поле хранило бы число, заданное в момент его установки. Геттер вычисляется заново при каждом чтении, поэтому его значение всегда актуально: выпейте стакан, и при следующей сборке значение log.left будет на единицу меньше.

challenge icon

Задание

Легко

Страница сама выполняет вычисления, и после достижения цели счётчик уходит ниже нуля. Перенеси правила в WaterLog:

  • Добавь геттер left: цель минус количество стаканов.
  • Добавь геттер done: значение становится true, когда количество стаканов достигает цели.
  • Показывай Goal reached!, когда log.done, а в противном случае — 8 to go, 7 to go и так далее, используя log.left.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Управление состоянием

Потренируйтесь самостоятельно: Онлайн-компилятор Flutter