为啥会出现此错误:无法在初始化程序中访问实例成员'*'。”?

Posted

技术标签:

【中文标题】为啥会出现此错误:无法在初始化程序中访问实例成员\'*\'。”?【英文标题】:Why does this error occur: The instance member '*' can't be accessed in an initializer."?为什么会出现此错误:无法在初始化程序中访问实例成员'*'。”? 【发布时间】:2021-07-28 05:27:28 【问题描述】:

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

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

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

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

我得到的错误信息是:

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

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

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

【问题讨论】:

见***.com/a/63319094和***.com/a/64548861。 【参考方案1】:

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

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

解决方法

    将属性设为静态

将依赖值设为静态:

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

  TeamList(
    this._numberOfTeams,
  ) : _teamPoints = List.filled(_numberOfTeams, 0);

    如果在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有更多信息

【讨论】:

以上是关于为啥会出现此错误:无法在初始化程序中访问实例成员'*'。”?的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法在字段初始化程序中访问“this”以读取“_endeks”[重复]

无法实例化邮件功能。为啥会出现这个错误

为啥静态初始化程序中的 lambda 无法访问 VC++2013 中类的私有成员?

为啥 Java 会出现“无法访问的语句”编译器错误?

出现“无法访问此站点”错误的 EC2 实例

致命错误:在第 7 行调用非对象上的成员函数 prepare()。我想不通,为啥会出现此错误?