Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Flutter 使用StatefulWidget将类标记为@immutable,实例字段不是final_Flutter_Dart_Final_Instance Variables_Statefulwidget - Fatal编程技术网

Flutter 使用StatefulWidget将类标记为@immutable,实例字段不是final

Flutter 使用StatefulWidget将类标记为@immutable,实例字段不是final,flutter,dart,final,instance-variables,statefulwidget,Flutter,Dart,Final,Instance Variables,Statefulwidget,我有一个名为ToggleButtonsList的无状态小部件,我的一个实例字段isSelectedType没有设置为final。这是我收到的警告,因为: 此类(或此类继承自的类)标记为“@immutable”,但其一个或多个实例字段不是最终字段:ToggleButtonsList.isSelectedType 以下是我代码的一部分: class ToggleButtonsList extends StatefulWidget { ToggleButtonsList({this.type, t

我有一个名为ToggleButtonsList的无状态小部件,我的一个实例字段isSelectedType没有设置为final。这是我收到的警告,因为:

此类(或此类继承自的类)标记为“@immutable”,但其一个或多个实例字段不是最终字段:ToggleButtonsList.isSelectedType

以下是我代码的一部分:

class ToggleButtonsList extends StatefulWidget {
  ToggleButtonsList({this.type, this.stringList});

  final String type;
  final List<String> stringList;
  List<bool> isSelectedType = [];

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

class _ToggleButtonsListState extends State<ToggleButtonsList> {
  @override
  Widget build(BuildContext context) {
   
   
  }
}

将MyApp类更改为StatefulWidget并没有消除警告。

我认为您混合使用了
State
StatefulWidget
类。
Widget
类本身是不可变的,并且
无状态Widget
状态Widget
都是从
Widget
类扩展而来的

在您的特定情况下,
isSelectedType
变量可以是
final
,因为最终集合可以增加或减少。只有固定的集合才不允许您增长或收缩

您需要做的是:

class ToggleButtonsList extends StatefulWidget {
  ToggleButtonsList({this.type, this.stringList});

  final String type;
  final List<String> stringList;

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

class _ToggleButtonsListState extends State<ToggleButtonsList> {
  List<bool> isSelectedType = [];

  @override
  Widget build(BuildContext context) {
   
   
  }
}
class ToggleButtonsList扩展StatefulWidget{
ToggleButtonsList({this.type,this.stringList});
最终字符串类型;
最终名单;
@凌驾
_ToggleButtonsListState createState()=>\u ToggleButtonsListState();
}
类_ToggleButtonsListState扩展状态{
列表为SelectedType=[];
@凌驾
小部件构建(构建上下文){
}
}

有状态和无状态小部件都需要是不可变的。 这是由
Widget
类上的
@immutable
强制执行的

见:

无状态小部件应该只有最终字段,没有例外。原因:当由于某种原因(屏幕旋转、动画、滚动…)重建父窗口小部件时,调用父窗口小部件的
build
方法,从而重建所有窗口小部件

extend
StatefulWidget
中的类必须遵循相同的规则,因为这些类也是重构的。在布局树中小部件的生存期内,只有状态(可以包含可变字段)被保留


我相信,虽然你可以使列表成为最终结果,从而安抚编译器,但这仍然是一件错误的事情(出于我在回答中描述的原因)
class ToggleButtonsList extends StatefulWidget {
  ToggleButtonsList({this.type, this.stringList});

  final String type;
  final List<String> stringList;

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

class _ToggleButtonsListState extends State<ToggleButtonsList> {
  List<bool> isSelectedType = [];

  @override
  Widget build(BuildContext context) {
   
   
  }
}