无状态颤动小部件中的非最终字段

时间:2020-02-09 05:26:30

标签: flutter widget final stateless

我有一个无状态的小部件,并且在编写代码时,我在无状态的小部件中使用了非最终字段,并且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] {},因为初始化可能涉及函数或循环

2 个答案:

答案 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) {}
}

但是函数必须是静态的,因为无法在初始化程序中访问实例成员。