我有一个无状态的小部件,并且在编写代码时,我在无状态的小部件中使用了非最终字段,并且ide不断警告我all the fields in stateless widget should be final
但是我不明白为什么在无状态小部件中包含非最终字段会成为问题。
我认为拥有非final字段应该很好,因为可能会有一个我们以后不想修改的字段,但是该字段只能在构造函数中初始化,因此您需要使用非最终字段
示例:
class Temp extends StatelessWidget {
final int a;
final int b;
int c;
temp({this.a, this.b}) {
this.c = this.a + this.b;
}
@override
Widget build(BuildContext context) {}
}
在上面的小部件中,我无法使c
成为最终版本,因为即使将来我不打算更改c
变量,也要在构造函数中对其进行初始化。
如果在无状态小部件中包含非最终字段不是一个好主意,那么如何处理上述情况。
注意:我无法使用Constructor() : [initialization] {}
,因为初始化可能涉及函数或循环
答案 0 :(得分:0)
StatelessWidget类不需要可变状态的小部件,因此该类被标记为@ immutable,Dart语言会最好地解决您的错误,因此“ final”关键字只会警告您,但不会停止编译,如果您确定代码将被初始化一次并且不会在运行时再次更改,则可以正常使用不带final关键字的代码。
这是拥有2个关键字(final,const)来定义Dart语言中的常量的主要原因
final和const都阻止重新分配变量。
const 值必须在编译时已知,const birth =“ 2020/02/09”。初始化后无法更改
必须在运行时知道最终的值,最终出生= getBirthFromDB()。初始化后无法更改
答案 1 :(得分:-1)
甚至可以将初始化用于函数调用。
这是一个示例:-
class SumWidget extends StatelessWidget {
final int sum;
static getSum(List<int> items) {
int perm = 0;
for (var value in items) {
perm += value;
}
return perm;
}
SumWidget(List<int> roles) : this.sum = getSum(roles);
@override
Widget build(BuildContext context) {}
}
但是函数必须是静态的,因为无法在初始化程序中访问实例成员。