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