Flutter 使用StatefulWidget将类标记为@immutable,实例字段不是final
我有一个名为ToggleButtonsList的无状态小部件,我的一个实例字段isSelectedType没有设置为final。这是我收到的警告,因为: 此类(或此类继承自的类)标记为“@immutable”,但其一个或多个实例字段不是最终字段:ToggleButtonsList.isSelectedType 以下是我代码的一部分: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
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
方法,从而重建所有窗口小部件
extendStatefulWidget
中的类必须遵循相同的规则,因为这些类也是重构的。在布局树中小部件的生存期内,只有状态(可以包含可变字段)被保留
我相信,虽然你可以使列表成为最终结果,从而安抚编译器,但这仍然是一件错误的事情(出于我在回答中描述的原因)
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) {
}
}