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

Mis*_*tyD 10 flutter

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

rmt*_*zie 18

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

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

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

以及如何从StatefulWidget文档中使用StatefulWidget的说明:

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


ttf*_*man 7

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

“final”表示单赋值:final 变量或字段必须有一个初始值设定项。一旦赋值,最终变量的值就不能改变。final 修改变量

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


Rém*_*let 6

这个问题没有确定的答案。这是更偏爱的。

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

实际上,您甚至可以启用自定义的linter规则prefer_final_locals,如果您拥有永不重新分配的非最终变量,则该规则将使编译失败。

这样可以进行双重健康检查:不可变的变量将无法更改。但是同时,如果您忘记对非最终变量进行突变,则编译器也会警告您。

  • 这个答案适用于大多数不是 StatefulWidget 的类,但对于 StatefulWidget 有一个直接的答案。另外 - 我认识到 OP 对他们问题的评论有点混淆了问题。 (2认同)