Сделайте поле приватным
Часть раздела Управление состоянием путешествия по 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 в списке файлов, чтобы отредактировать его.
Задание
СреднеКнопки напрямую изменяют 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'),
),
],
),
],
),
),
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Управление состоянием
2Dart для моделей
Методы ваших классовГеттеры в ваших классахСделайте поле приватнымСуммирование списка с помощью foldПотренируйтесь самостоятельно: Онлайн-компилятор Flutter