我有一个名为 ToggleButtonsList 的无状态小部件,我的实例字段之一 isSelectedType 未设置为最终字段。这是我因此收到的警告:
“此类(或此类继承自的类)被标记为‘@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) {
}
}
我的问题:我认为需要将实例字段设置为最终仅适用于无状态小部件,而非有状态小部件。这是真的?这是我应该担心的警告,因为我没有使用 StatelessWidget 还是可以忽略它?当我忽略警告时,我的应用似乎运行良好。
阅读警告的“或此类继承自的类” 部分让我尝试在我的项目中搜索此类可能继承自的任何 StatelessWidget,而我的项目中唯一的 StatelessWidget 是来 self 的 main.dart :
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
primaryColor: Colors.blueGrey,
scaffoldBackgroundColor: Colors.blueGrey),
home: PriceScreen(),
);
}
}
将我的 MyApp 类更改为 StatefulWidget 并没有消除警告。
最佳答案
我认为您混合了 State
和 StatefulWidget
类。 Widget
类本身是 immutable
并且 StatelessWidget
和 StatefulWidget
都继承自 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) {
}
}
关于flutter - 使用 StatefulWidget 标记为 @immutable 的类,实例字段不是最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64207910/