为什么某些变量在flutter自定义类中被标记为final?

时间:2018-04-30 21:09:23

标签: flutter

我在网上的一些例子中注意到,扩展StatefulWidget的类具有标记为final的实例变量。这是为什么 ? 我理解final关键字的作用。我不明白为什么用扩展widget类的每个实例变量声明它。

5 个答案:

答案 0 :(得分:11)

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

如果使用非final字段创建StatefulWidget子类,则会导致此DartAnalysis警告:

  

info:此类继承自标记为@immutable的类,并且   因此应该是不可变的(所有实例字段必须是最终的)。   (在[...] lib的must_be_immutable ...... dart:23)

解释如何使用StatefulWidget documentation中的StatefulWidget:

  

StatefulWidget实例本身是不可变的并存储它们   可变状态,或者在由。创建的单独状态对象中   createState方法,或者在State订阅的对象中   示例引用的Stream或ChangeNotifier对象   存储在StatefulWidget本身的最终字段中。

答案 1 :(得分:3)

有了 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 关键字的变量将在运行时初始化,并且只能分配一次。

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

  • 对于 Flutter 而言,当状态更新时,build 方法中的所有内容都会再次初始化。这包括所有带有 final 的变量。

    @override
    Widget build(BuildContext context) {
      // your code
    }
    

常量

  • 带有 const 关键字的变量在编译时初始化,并在运行时已分配。
  • 您不能在类中定义 const。但是你可以在一个函数中。
  • 对于 Flutter 而言,当状态更新时,构建方法中的所有内容都不会再次初始化。
  • 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

答案 2 :(得分:2)

这个问题没有有限的答案。这是一种偏好。

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

实际上,你甚至可以启用一个名为prefer_final_locals的自定义linter规则,如果你有一个永不重新分配的非final变量,它将使编译失败。

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

答案 3 :(得分:0)

“ final”与应用程序中的“ const”非常相似,但由于编译时的原因而有所不同:请参见此link或以下内容以获取进一步的说明:

“最终” 表示单分配:最终变量或字段必须具有初始化程序。一旦分配了值,最终变量的值将无法更改。 final修改变量

“ const” 的含义在Dart中更加复杂和微妙。 const修改。您可以在创建集合时使用它,例如const [1、2、3],以及在构造对象(而不是new)时使用const Point(2,3)。在这里,const表示可以在编译时完全确定对象的整个深度状态,并且对象将被冻结并且完全不可变。

答案 4 :(得分:0)

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