final 变量
本课属于 Coddy Flutter 学习旅程的“让应用具有交互性”单元。第 16 课,共 34 课。
final 是表示值不会改变的另一个词。final 变量只会获得一次值,之后不能再赋予其他值:
final int total = _tickets * 12;
total = 50; // 错误:total 是 final 变量它和 const 的区别在于值何时确定。const 值在你编写代码时就已确定,比如 12。final 值可以在应用运行时计算出来,比如 _tickets * 12,它取决于当前的票数。
const int price = 12; // 始终是 12
final int total = _tickets * price; // 运行 build 时才能确定在 build 开头声明的 final 变量会在每次构建时重新计算,所以调用 setState 后,它会保存新的总数。对于只设置一次、只读取的值,使用 final;对于会改变的值,例如 _tickets,使用普通的 int 或 String。
挑战
简单一张票的价格是 12。在 build 的开头,添加 const int price = 12;,再添加一个 final 变量 total,其值为 _tickets 乘以 price。将 Total: ? 替换为 Total: 12,这样再添加一张票后,显示的就是 Total: 24。
亲手试试
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _tickets = 1;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Tickets')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Tickets: $_tickets', style: const TextStyle(fontSize: 24)),
Text('Total: ?', style: const TextStyle(fontSize: 24)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
setState(() {
_tickets++;
});
},
child: const Text('Add a ticket'),
),
],
),
),
);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
让应用具有交互性中的所有课
自己练习: Flutter 在线编译器