用dart编写构造函数时遇到问题。我有一个带有两个最终变量的类,请在构造函数中对其进行初始化,这是错误的,因为最终变量没有设置方法:
async nativeGoogleLogin(): Promise<firebase.User> {
try {
const gplusUser = await this.gplus.login({
'webClientId': environment.googleWebClientId,
'offline': true,
'scopes': 'profile email'
});
return await this.afAuth.auth.signInWithCredential(
firebase.auth.GithubAuthProvider.credential(gplusUser.idToken)
);
} catch (err) {
console.log(err);
}
}
}
但这是正确的,为什么
class Person{
final String name;
final int age;
// Error
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
答案 0 :(得分:3)
执行构造函数主体时,final
个字段已经被密封。
构造器初始化器列表在超类的构造器初始化器之前执行。
构造函数体随后执行。构造函数主体允许执行任意代码,就像从字段读取一样。这就是为什么此时必须完成final字段的初始化的原因,否则就有可能从尚未初始化的final字段中读取数据。
构造函数初始化器列表是受支持的窗口,可以在其中初始化最终字段。它不允许读取this
(显式或隐式),因此很安全。
这只是确保对象初始化始终以可预测的方式发生的一种措施。