我在网上的一些例子中注意到,扩展StatefulWidget
的类具有标记为final的实例变量。这是为什么 ?
我理解final关键字的作用。我不明白为什么用扩展widget类的每个实例变量声明它。
答案 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
。但是你可以在一个函数中。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)