Menu
CoddyTech

为你的类添加方法

本课属于 Coddy Flutter 学习旅程的“状态管理”单元。第 5 课,共 27 课。

到目前为止,你的类都保存着数据:名称、价格。类也可以保存用来修改这些数据的代码。类中的函数称为方法:

class Wallet {
  int coins = 10;

  void earn(int amount) {
    coins = coins + amount;
  }
}

像访问字段一样,用点号调用方法,例如:wallet.earn(3)。在方法内部,coins 是调用该方法的钱包的字段。

既然页面可以自己编写 wallet.coins = wallet.coins + 3,为什么还要这么做?因为这样规则就集中在一处。如果钱包的余额不能低于零,spend 方法就会检查这一点,每个用于消费的按钮都会通过这项检查。

这个组件仍会在调用前后使用 setState,这样屏幕上就会显示新的数字。

challenge icon

挑战

简单

现在,Spend 5 会直接从字段中扣除硬币,导致钱包余额变成负数。

  • 在 Wallet 中添加方法 void spend(int amount),只有硬币足够时才扣除。
  • 让 Spend 5 按钮在 setState 中调用 wallet.spend(5)。

亲手试试

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class Wallet {
  int coins = 10;

  void earn(int amount) {
    coins = coins + amount;
  }
}

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 wallet = Wallet();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Wallet')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('${wallet.coins} coins', style: const TextStyle(fontSize: 32)),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  wallet.earn(3);
                });
              },
              child: const Text('Earn 3'),
            ),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  wallet.coins = wallet.coins - 5;
                });
              },
              child: const Text('Spend 5'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz icon自我测试

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

状态管理中的所有课

自己练习: Flutter 在线编译器