Menu
CoddyTech

Сделайте поле приватным

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

Термостат не должен нагреваться выше 26 градусов или охлаждаться ниже 16 градусов. Метод warmer может это проверять, но только если никто не может изменить число другим способом. Пока поле открыто, любой код может выполнить запись thermostat.degrees = 99.

Имя, начинающееся с _, является приватным: его может использовать только код в том же файле. Помести класс в отдельный файл, сделай поле приватным и предоставь внешний геттер для его чтения, а также методы для изменения:

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

  int get degrees => _degrees;

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

Страница импортирует файл с помощью import 'thermostat.dart';. Она может читать thermostat.degrees, но thermostat.degrees++ больше не компилируется: есть геттер, но нет способа присвоить значение. Изменить градусы можно только с помощью методов, поэтому ограничения всегда соблюдаются.

Открой thermostat.dart в списке файлов, чтобы отредактировать его.

challenge icon

Задание

Средне

Кнопки напрямую изменяют degrees на странице без ограничений. В файле thermostat.dart:

  • Переименуй поле в _degrees и добавь геттер degrees, который возвращает его.
  • Добавь warmer(), который увеличивает значение на 1 до 26, и cooler(), который уменьшает значение на 1 до 16.

Затем заставь кнопки в файле main.dart вызывать thermostat.warmer() и thermostat.cooler().

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

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

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

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

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