我来自 python 背景,试图学习类 java 语言。这是用 dart 编写的,用于 Flutter。
当我尝试运行以下命令时出现错误。
class _MyGameState extends State<MyGame> {
int _numberOfTeams = 4;
List<int> _teamPoints = List.filled(_numberOfTeams, 0);
我得到的错误信息是:
<块引用>无法在初始化程序中访问实例成员“_numberOfTeams”。 尝试用不同的表达式替换对实例成员的引用
这是为什么,如何避免? (显然,这个例子是简化的,我可以很容易地简单地省略变量 _numberOfTeams
并绕过这个问题,但这不是重点。)
(这里有很多非常相似的问题。这些问题的所有答案都提供了解决特定问题的方法,但不是“为什么”出现问题或写作时如何思考在这很常见的语言中。我可以查看一些相关的搜索词,或指向指南/教程/文章的链接将不胜感激:)
答案 0 :(得分:5)
由于您位于对象内部而不是方法中,因此属性 _numberOfTeams
和 _teamPoints
不能依赖于要创建的其他属性,因为它们可能尚未初始化。
看下面的例子,是的,有点傻,但是编译器的情况是一样的,它不能保证一个在另一个之前创建。
List<int> _teamPoints = List.filled(_numberOfTeams, 0);
int _numberOfTeams = _teamPoints.length;
将依赖值设为静态:
static int _numberOfTeams = 4;
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 中有更多信息