为什么某些变量在 flutter custom 类 中标记为 final?

Why are certain variables marked as final in flutter custom classes?

我注意到在一些在线示例中,扩展 StatefulWidget 的 classes 具有标记为 final 的实例变量。这是为什么? 我了解 final 关键字的作用。我不明白为什么要用扩展小部件 class.

的每个实例变量来声明它

这个问题没有固定的答案。这更像是一种偏好。

事实是,如果一个变量可以声明为 final,那么为什么 而不是 声明呢? final 关键字根本不会损害您的代码,并且可能有助于捕获错误。

事实上,您甚至可以启用名为 prefer_final_locals 的自定义 linter 规则,如果您有一个永远不会重新分配的非最终变量,这将使编译失败。

这允许进行双重健康检查:不可变变量将无法更改。但同时,如果你忘记改变一个非final变量,编译器也会警告你。

因为StatefulWidget继承Widget,标记为@immutableStatefulWidget的任何子类也必须是不可变的(即所有字段都是final)。

如果您使用非最终字段创建 StatefulWidget 子类,将导致此 Dart 分析警告:

info: This class inherits from a class marked as @immutable, and therefore should be immutable (all instance fields must be final). (must_be_immutable at [...] lib....dart:23)

以及如何使用 StatefulWidget 来自 StatefulWidget documentation 的解释:

StatefulWidget instances themselves are immutable and store their mutable state either in separate State objects that are created by the createState method, or in objects to which that State subscribes, for example Stream or ChangeNotifier objects, to which references are stored in final fields on the StatefulWidget itself.

"final" 在应用程序中与 "const" 非常相似,但由于编译时原因而有所不同:请参阅此 link 或以下内容以获取更多解释:

"final" 表示单一赋值:final 变量或字段 必须 具有初始值设定项。一旦分配了一个值,final 变量的值就不能改变。 final 修改 variables.

"const" 在 Dart 中的含义有点复杂和微妙。 const 修改 values。您可以在创建集合时使用它,如 const [1, 2, 3],以及在构造对象(而不是 new)时如 const Point(2, 3)。在这里,const 意味着对象的整个深层状态可以在编译时完全确定,并且对象将被冻结并且完全不可变。

从我看flutter团队开发的无聊节目中了解到的。 Final 和 Const 很有用,因为它有助于 flutter 知道这些值不会被更新,因此算法可以更有效地找出要更新的内容。如果我错了请大家指正

有了 JavaScript/TypeScript 背景,您已经熟悉 const 关键字。在Java中,你没有const,但等于final。当我开始使用 Dart(用于 Flutter)时,我对这两个可用的关键字感到惊讶。

const String personConst = 'Jeroen';
final String personFinal = 'Jeroen';

personConst = 'Bob'; // Not allowed
personFinal = 'Bob'; // Not allowed

在上面的代码中,我们创建了一个 const 和一个 final 变量,并将我的名字分配给两者。您不能重新分配它们。 但是有什么区别呢?

决赛

  • 带有final关键字的变量将在运行时初始化并且只能被赋值一次。

  • 在一个class和函数中,你可以定义一个final变量。

  • 对于Flutter specific,当state更新时,build方法中的所有东西都会被重新初始化。这包括带有 final.

    的所有变量
    @override
    Widget build(BuildContext context) {
      // your code
    }
    

常数

  • 带有 const 关键字的变量在编译时初始化,并在运行时已赋值。
  • 您不能在 class 中定义 const。但是你可以在函数中。
  • 对于 Flutter 特定的,build 方法中的所有内容都不会在更新状态时再次初始化。
  • const 无法在运行时更改。

什么时候使用哪个关键字?

两者的一个简单示例:

  • 使用final:如果你不知道它在编译时的值是多少。例如,当您可能需要从 API 获取数据时,这会在 运行 您的代码时发生。
  • 使用const:如果您确定在运行您的代码时不会更改某个值。例如,当您声明一个始终保持不变的句子时。

final 与 var

final vs. var:声明变量时,尽可能使用 final 而不是 var 。这告诉 Dart 变量不应在初始化后重新分配。如果任何代码试图再次设置该值,代码分析器将提醒您。如果变量的值在初始化后不应更改,Dart 的 final 关键字可以帮助您避免与意外突变相关的错误。

您可能已经注意到使用命名参数的一个问题是它们是可选的,有时这是不受欢迎的。

发件人:https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573

为什么我们使用final,我们可以从中得到什么好处。

我认为经常创建小部件很好。它涉及UI渲染模型和线程模型。 不可变变量是线程安全的。 欢迎补充回答。