Menu
CoddyTech

在类中使用 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。

challenge icon

挑战

简单

页面会自行计算,达到目标后,计数会变成负数。把规则移到 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'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

状态管理中的所有课

自己练习: Flutter 在线编译器