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

uuu*_*uuk 1 initialization instance dart flutter

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

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

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

  List<int> _teamPoints = List.filled(_numberOfTeams, 0);
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是:

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

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

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

cro*_*x5f 7

当你是一个对象的内部,而不是在一个方法的属性_numberOfTeams,并_teamPoints不能依赖于其他属性被创建,因为他们可能还没有被初始化。看下面的例子,是的,这有点傻,但编译器的情况是一样的,它不能保证一个在另一个之前创建。

  List<int> _teamPoints = List.filled(_numberOfTeams, 0);
  int _numberOfTeams = _teamPoints.length;
Run Code Online (Sandbox Code Playgroud)

解决方法

  1. 使属性静态

使依赖值静态:

  List<int> _teamPoints = List.filled(_numberOfTeams, 0);
  int _numberOfTeams = _teamPoints.length;
Run Code Online (Sandbox Code Playgroud)
  1. 如果在类中,您可以使用初始化列表
class TeamList {
  int _numberOfTeams;
  List<int> _teamPoints;

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

  late List<int> _teamPoints;

  @override
  void initState() {
    super.initState();
    _teamPoints = List.filled(_numberOfTeams, 0)
  }
Run Code Online (Sandbox Code Playgroud)

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

dart.dev 中有更多信息