将字段设为私有
本课属于 Coddy Flutter 学习旅程的“状态管理”单元。第 7 课,共 27 课。
恒温器的温度不应超过 26 度,也不应低于 16 度。warmer 方法可以检查这一点,但前提是没有人能通过其他方式更改这个数值。字段是公开的时,任何代码都可以写入 thermostat.degrees = 99。
以下划线 _ 开头的名称是私有的:只有同一文件中的代码才能使用它。把类放在单独的文件中,将字段设为私有,并提供 getter 供外部读取,再通过方法更改它:
// 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++ 不再能通过编译:这里有 getter,却没有设置它的方法。只能通过这些方法更改温度,因此温度始终会保持在限制范围内。
在文件列表中打开 thermostat.dart 进行编辑。
挑战
中等这些按钮可以直接在页面中更改 degrees,没有任何限制。在 thermostat.dart 中:
- 将字段重命名为
_degrees,并添加一个返回该字段的 getterdegrees。 - 添加
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'),
),
],
),
],
),
),
);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
状态管理中的所有课
自己练习: Flutter 在线编译器