为什么会出现此错误:无法在初始值设定项中访问实例成员。&q;? [英] Why does this error occur: The instance member '*' can't be accessed in an initializer."?

查看:24
本文介绍了为什么会出现此错误:无法在初始值设定项中访问实例成员。&q;?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我来自一个python背景,试图学习类似Java的语言。这是用飞镖写的,用于扑翼。

尝试运行以下程序时出错。

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

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

我收到的错误消息是:

无法在初始值设定项中访问实例成员‘_number OfTeams’。 尝试用不同的表达式替换对实例成员的引用

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

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

推荐答案

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

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

解决方法

  1. 将属性设置为静态

将Dependant值设为静态:

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

  TeamList(
    this._numberOfTeams,
  ) : _teamPoints = List.filled(_numberOfTeams, 0);
}
  1. 如果在State内,您可以@覆盖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

中有更多信息

这篇关于为什么会出现此错误:无法在初始值设定项中访问实例成员。&q;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆