在类中使用 getter
本课属于 Coddy Flutter 学习旅程的“状态管理”单元。第 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 就会少 1。
挑战
简单页面会自行计算,达到目标后,计数会变成负数。把规则移到 WaterLog 中:
- 添加一个 getter
left:目标减去已喝的杯数。 - 添加一个 getter
done:杯数达到目标后返回true。 - 当
log.done为真时,显示Goal reached!;否则根据log.left显示8 to go、7 to go等。
亲手试试
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'),
),
],
),
),
);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
状态管理中的所有课
自己练习: Flutter 在线编译器