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

Posted

技术标签:

【中文标题】无状态颤振小部件中的非最终字段【英文标题】:non final field in stateless flutter widget 【发布时间】:2020-05-24 18:54:06 【问题描述】:

我有一个无状态小部件,在编写代码时,我在无状态小部件中使用了一个非最终字段,并且 ide 不断给我警告all the fields in stateless widget should be 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 设为 final,因为它是在构造函数中初始化的,即使我以后不打算更改 c 变量。

如果在无状态小部件中具有非最终字段不是一个好主意,那么如何处理上述情况。

注意:我不能使用Constructor() : [initialization] ,因为初始化可能涉及函数或循环

【问题讨论】:

如果无状态小部件不能满足您的需求,请使用 StatedfulWidget。 我能做到。但我没有使用任何 StateFulWidget 功能。这没有意义 用a、b、c创建一个数据模型,并将数据模型传递给StatelessWidget怎么样? 我不了解数据模型。你能提供一个信息链接吗? 只是一个包含三个成员的类:a、b、c 【参考方案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) 

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

【讨论】:

【参考方案2】:

StatelessWidget 类 不需要可变状态的小部件,因此该类被标记为@immutable,Dart 语言会尽力修复您的错误,因此“final”关键字只会警告您但不会停止编译,如果您确定代码会初始化一次并且在运行时不会再次更改,则可以在没有 final 关键字的情况下正常使用代码..

这也是 Dart 语言中有 2 个关键字(final、const)来定义常量的主要原因

final 和 const 都防止变量被重新分配。

const 值必须在编译时已知,constbirth = "2020/02/09"。初始化后无法更改

final 值必须在运行时已知,最终出生 = getBirthFromDB()。初始化后无法更改

【讨论】:

以上是关于无状态颤振小部件中的非最终字段的主要内容,如果未能解决你的问题,请参考以下文章

无法将 onTap 字段传递给无状态小部件

在 Flutter 中使用 BLoC - 在有状态小部件与无状态小部件中的使用

Flutter 中的有状态和无状态小部件之间的关系是啥?

Flutter:何时创建无状态或有状态页面?

如何在有状态或无状态小部件之外访问 BuildContext?

从无状态小部件调用有状态小部件的 setState