为你的类添加方法
本课属于 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,这样屏幕上就会显示新的数字。
挑战
简单现在,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'),
),
],
),
),
);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
状态管理中的所有课
自己练习: Flutter 在线编译器