为啥会出现此错误:无法在初始化程序中访问实例成员'*'。”?
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”[重复]