Class 标记为@immutable,实例字段不是最终使用 StatefulWidget

Class marked as @immutable, instance field not final using StatefulWidget

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

“此 class(或此 class 继承自的 class)被标记为“@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 还是可以忽略它?当我忽略警告时,我的应用程序似乎运行良好。

阅读 " 或此 class 继承自的 class" 部分警告让我尝试在我的项目中搜索任何 StatelessWidgets class 可能继承自并且我在我的项目中拥有的唯一 StatelessWidget 来自我的 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 class 更改为 StatefulWidget 并没有消除警告。

我认为你混合了 StateStatefulWidget class。 Widget class 本身是 immutable 并且 StatelessWidgetStatefulWidget 都从 Widgetclass.

扩展而来

在您的特定情况下,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) {
   
   
  }
}

有状态和无状态小部件都需要是不可变的。 这是由 @immutableWidget class.

上强制执行的

参见

Stateless widgets should only have final fields, with no exceptions. Reason: When the parent widget is rebuilt for some reason (screen rotation, animations, scrolling...), the build method of the parent is called, which causes all widgets to be reconstructed.

Classes the extend StatefulWidget must follow the same rule, because those are also reconstructed. Only the State, which can contain mutable fields, is kept during the lifetime of widget in the layout tree.