Menu
CoddyTech

将字段设为私有

本课属于 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 进行编辑。

challenge icon

挑战

中等

这些按钮可以直接在页面中更改 degrees,没有任何限制。在 thermostat.dart 中:

  • 将字段重命名为 _degrees,并添加一个返回该字段的 getter 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 在线编译器