为什么会发生此错误:无法在初始化程序中访问实例成员“*”。”?

时间:2021-05-05 21:27:45

标签: flutter dart initialization instance

我来自 python 背景,试图学习类 java 语言。这是用 dart 编写的,用于 Flutter。

当我尝试运行以下命令时出现错误。

class _MyGameState extends State<MyGame> {
  int _numberOfTeams = 4;

  List<int> _teamPoints = List.filled(_numberOfTeams, 0);

我得到的错误信息是:

<块引用>

无法在初始化程序中访问实例成员“_numberOfTeams”。 尝试用不同的表达式替换对实例成员的引用

这是为什么,如何避免? (显然,这个例子是简化的,我可以很容易地简单地省略变量 _numberOfTeams 并绕过这个问题,但这不是重点。)

(这里有很多非常相似的问题。这些问题的所有答案都提供了解决特定问题的方法,但不是“为什么”出现问题或写作时如何思考在这很常见的语言中。我可以查看一些相关的搜索词,或指向指南/教程/文章的链接将不胜感激:)

1 个答案:

答案 0 :(得分:5)

由于您位于对象内部而不是方法中,因此属性 _numberOfTeams_teamPoints 不能依赖于要创建的其他属性,因为它们可能尚未初始化。 看下面的例子,是的,有点傻,但是编译器的情况是一样的,它不能保证一个在另一个之前创建。

  List<int> _teamPoints = List.filled(_numberOfTeams, 0);
  int _numberOfTeams = _teamPoints.length;

解决方法

  1. 将属性设为静态

将依赖值设为静态:

static int _numberOfTeams = 4;
  1. 如果在类中,您可以使用 initializer list
class TeamList {
  int _numberOfTeams;
  List<int> _teamPoints;

  TeamList(
    this._numberOfTeams,
  ) : _teamPoints = List.filled(_numberOfTeams, 0);
}
  1. 如果在 State 里面,你可以@override initState
class _HomeState extends State<Home> {
  int _numberOfTeams = 4;

  late List<int> _teamPoints;

  @override
  void initState() {
    super.initState();
    _teamPoints = List.filled(_numberOfTeams, 0)
  }

我更喜欢方法 2 或 3,因为它们仍然是对象内部状态的实例,您只需稍微推迟它的创建。

dart.dev 中有更多信息