flutter(dart)中的变量什么时候需要使用final

San*_*San 7 dart flutter

我很困惑什么时候必须对变量使用final。

根据 StackOverflow 上的文档和答案,

如果你创建一个带有非final字段的StatefulWidget子类,将会导致DartAnalysis警告

但我上了这门课,一切都进展顺利

class Order extends StatefulWidget {
  int hello = 1;

  @override
  _OrderState createState() => _OrderState();
}

class _OrderState extends State<Order> {
  pizza _pizzaOrder = new pizza();

  void setSize(String value) {
    setState(() {
      _pizzaOrder.size = value;
      print(++widget.hello);
    });
  }
Run Code Online (Sandbox Code Playgroud)

我制作了一个简单的应用程序,并且从未在程序中的任何地方使用过final或const。那么我必须在任何地方使用“final”/“const”吗?还是只是为了优化?什么时候应该使用“final”?

die*_*per 5

我认为这与 OOP 原则SOLID更相关,特别是开/闭原则。

当您构建小部件时,某些情况下您需要构造函数的一些参数才能定义类的属性。如果您不使用final您的属性,那么它可以被其他类(包括状态)修改。

在你的情况下:

print(++widget.hello);
Run Code Online (Sandbox Code Playgroud)

它可以工作,但可能会导致意外行为,想象一下许多类访问该属性并修改它,您不希望这样吗?

我发现了另一个原因StatefulWidget

StatefulWidget 实例本身是不可变的,并且将其可变状态存储在由 createState 方法创建的单独 State 对象中,或者存储在该 State 订阅的对象中,例如 Stream 或 ChangeNotifier 对象,这些对象的引用存储在 StatefulWidget 上的 Final 字段中本身。