Dart报错:初始化器无法访问实例成员'id',如何用传入id初始化Firebase DocumentReference?
报错说明
The instance member 'id' can't be accessed in an initializer.
中文含义:无法在初始化器中访问实例成员id
报错原因
Dart 类的实例初始化阶段,会先完成类字段的初始化赋值,再执行构造函数的逻辑。你在声明users字段时直接引用id,此时id还没有完成赋值,因此会触发语法报错。
解决方案
有两种常用的修复方式:
方式1:在构造函数初始化列表中赋值(更推荐)
将users的赋值逻辑放到构造函数的初始化列表中,初始化列表执行时id已经完成赋值,可以正常访问:
import 'package:cloud_firestore/cloud_firestore.dart'; class AddUser { final String answer; final String id; final DocumentReference users; AddUser(this.answer, this.id) : users = FirebaseFirestore.instance.collection('Questions').doc("ceb").collection("ceb").doc(id); }
这种写法是编译时安全的,不会出现运行时空异常风险,适合不需要后续修改users值的场景。
方式2:用late修饰符延迟初始化
如果你的Dart版本在2.12及以上,也可以用late修饰users,告诉编译器这个字段会在使用前完成初始化:
import 'package:cloud_firestore/cloud_firestore.dart'; class AddUser { final String answer; final String id; AddUser(this.answer,this.id); late final DocumentReference users = FirebaseFirestore.instance.collection('Questions').doc("ceb").collection("ceb").doc(id); }
注意如果声明了late但实际使用前没有完成赋值,运行时会抛出异常。
内容的提问来源于stack exchange,提问作者Vinasirajan Vilakshan
相关产品推荐
相关产品推荐

