Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候有必要对颤振(dart)中的变量使用final_Dart_Flutter - Fatal编程技术网

什么时候有必要对颤振(dart)中的变量使用final

什么时候有必要对颤振(dart)中的变量使用final,dart,flutter,Dart,Flutter,我不知道什么时候必须用final来表示变量 根据有关StackOverflow的文件和答案 如果使用非final字段创建StatefulWidget子类,将导致DartAnalysis警告 但我上了这门课,一切都很顺利 class Order extends StatefulWidget { int hello = 1; @override _OrderState createState() => _OrderState(); } class _OrderState ext

我不知道什么时候必须用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);
    });
  }
类顺序扩展StatefulWidget{
int hello=1;
@凌驾
_OrderState createState()=>\u OrderState();
}
类_OrderState扩展了状态{
比萨饼_pizzaOrder=新比萨饼();
void setSize(字符串值){
设置状态(){
_pizzaOrder.size=值;
打印(++widget.hello);
});
}
我制作了一个简单的应用程序,在程序中的任何地方都没有使用final或const。所以我必须在任何地方使用final/“const”?还是只是为了优化?
什么时候应该使用“final”?

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

在某些情况下,当您构建小部件时,您需要为构造函数提供一些参数,以便定义类的属性。 如果未对属性使用
final
,则可以由其他类(包括state)对其进行修改

就你而言:

print(++widget.hello);
它可以工作,但可能会导致意外行为,想象一下许多类访问该属性并对其进行修改,您不希望这样吗

我找到了另一个原因

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


除了diegoveloper已经说过的内容之外,想象一下,您在运行应用程序时,在
Order StatefulWidget
中添加了一个新参数,希望它能够热加载

订单小部件将被重新创建,但由于是热重新加载,
状态
对象将保留其现有值。在这种情况下,您应该在状态对象中保持此状态,但在您的示例中,
hello
中的值将丢失(即将重置回1)

这样您就不会丢失
hello
状态:

class Order extends StatefulWidget {
  Order({this.hello});
  final int hello;

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

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

  @override
  initState() {
    _hello = widget.hello;
  }

  void setSize(String value) {
    setState(() {
      _pizzaOrder.size = value;
      print(++_hello);
    });
  }
如果将父项更改为:

Order(hello: 2);
然后再次热加载,参数是final,StatefulWidget被重新创建,State对象被维护,但它不会根据widget的新参数更新其值。为此,您可以使用
diupdatewidget
然后:

class Order extends StatefulWidget {
  Order({this.hello});
  final int hello;

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

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

  @override
  initState() {
    _hello = widget.hello;
  }

  @override
  void didUpdateWidget(Order oldWidget) {
    super.didUpdateWidget(oldWidget);
    setState(() {
      _hello = widget.hello;
    });
  }

  void setSize(String value) {
    setState(() {
      _pizzaOrder.size = value;
      print(++_hello);
    });
  }
类顺序扩展StatefulWidget{
订单({this.hello});
最后的int你好;
@凌驾
_OrderState createState()=>\u OrderState();
}
类_OrderState扩展了状态{
比萨饼_pizzaOrder=新比萨饼();
你好,;
@凌驾
initState(){
_hello=widget.hello;
}
@凌驾
void didUpdateWidget(Order oldWidget){
super.didUpdateWidget(oldWidget);
设置状态(){
_hello=widget.hello;
});
}
void setSize(字符串值){
设置状态(){
_pizzaOrder.size=值;
打印(+++\u hello);
});
}

我有点偏离了问题,但我认为它在某种程度上是相关的。

顺序({this.hello});final int hello=1;
这会给出错误。我想你留下了一个打字错误是的,复制和粘贴,没有测试…)谢谢,编辑。
class Order extends StatefulWidget {
  Order({this.hello});
  final int hello;

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

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

  @override
  initState() {
    _hello = widget.hello;
  }

  @override
  void didUpdateWidget(Order oldWidget) {
    super.didUpdateWidget(oldWidget);
    setState(() {
      _hello = widget.hello;
    });
  }

  void setSize(String value) {
    setState(() {
      _pizzaOrder.size = value;
      print(++_hello);
    });
  }