什么时候有必要对颤振(dart)中的变量使用final
我不知道什么时候必须用final来表示变量 根据有关StackOverflow的文件和答案 如果使用非final字段创建StatefulWidget子类,将导致DartAnalysis警告 但我上了这门课,一切都很顺利什么时候有必要对颤振(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
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);
});
}