【问题标题】:This class (or a class which this class inherits from) is marked as '@imutable' but one or more of its instance fields are not final此类(或此类继承自的类)被标记为“@imutable”,但其一个或多个实例字段不是最终的
【发布时间】:2020-04-14 06:28:04
【问题描述】:

我在 Android Studio 中的 stateless 小部件

中收到此警告

这个类(或者这个类继承自的一个类)被标记为 '@imutable' 但它的一个或多个实例字段不是最终的

当我想在构建方法之外创建变量时。我该如何摆脱这个警告......还是我做错了什么?

可复制代码

class TestScreen extends StatelessWidget {
  final List<Map<String, dynamic>> list = [
    {'id': 1, 'name': 'name1'},
    {'id': 2, 'name': 'name2'}
  ];
  List<int> _ids = [];
  @override
  Widget build(BuildContext context) {
    _ids.clear();
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
                itemCount: list.length,
                itemBuilder: (BuildContext context, int index) {
                  _ids.add(list[index]['id']);
                  return ListTile(
                    title: Text(list[index]['name']),
                  );
                }),
          ),
          FlatButton(
            child: Text('Print all ids'),
            onPressed: () {
              print(_ids.toString());
            },
          )
        ],
      ),
    );
  }
}

平安无事的警告信息

【问题讨论】:

  • 不可变的意思是一个初始化一次的类,包括所有的类变量。一旦初始化,就永远无法更改。不可变类保证是线程安全的!在此处更改状态的任何方法都要小心。
  • @MartinStrejc 我刚刚用更好的示例编辑了我的代码,那么在这种情况下你的方法是什么。你会在哪里放置 _ids 变量以消除该警告

标签: flutter dart


【解决方案1】:

您必须将两个列表都标记为最终列表。您仍然可以在列表中添加和删除元素,但不能重新初始化它们。

你可以

list.add('c')

你不能

list = ['apple']

在您的情况下,正确的代码如下所示:

class Test extends StatelessWidget {
  Final List<String> list = ['a', 'b'];
  Final List<int> _ids = [];

【讨论】:

  • ups 对不起.. 我其实可以
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2015-11-25
  • 2013-08-08
  • 2022-01-10
相关资源
最近更新 更多