Menu
CoddyTech

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。

challenge icon

挑战

简单

一张票的价格是 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'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz icon自我测试

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

让应用具有交互性中的所有课

自己练习: Flutter 在线编译器