调用null对象的"collection"方法报错,尝试调用collection("user")如何解决
问题原因
报错The method 'collection' was called on null的核心是你代码中使用的firebaseFirestore变量为null,没有指向有效的Firestore实例,常见触发原因如下:
- 没有给
firebaseFirestore变量做初始化赋值,未将Firebase初始化后返回的Firestore实例绑定到该变量上 - Firebase初始化是异步操作,你点击查看个人资料按钮时,Firebase初始化流程还未执行完成,
firebaseFirestore还未被赋值就被调用 firebaseFirestore变量存在作用域问题,比如仅在局部方法内声明赋值,其他方法调用时访问的是未赋值的全局同名变量
修复方案
- 应用启动阶段就完成Firebase初始化和实例绑定,示例代码如下:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化Firebase核心服务 await Firebase.initializeApp(); // 全局绑定Firestore实例 firebaseFirestore = FirebaseFirestore.instance; runApp(const MyApp()); }
- 调用Firestore相关方法前增加非空校验,避免空指针异常,修改你的业务代码如下:
getProfileDetailFromFirestore(String token) { // 先校验实例是否有效 if (firebaseFirestore == null) { // 可根据业务需求增加重试、 Toast 提示逻辑 return; } firebaseFirestore.collection("user").doc(token).snapshots().listen((value) { if (value.exists && value.data() != null) { profileDataSink.add(profileObject.fromMapObject(value.data()!)); } }); } Future<void> followOrUnFollowUser(String selfToken, String friendToken, ProfileObject self, ProfileObject friend, bool isUserFollowing) async { if (firebaseFirestore == null) return; await firebaseFirestore.collection("user").doc(selfToken).update({ "following": isUserFollowing ? FieldValue.arrayRemove([friend.toMapLimitedData()]) : FieldValue.arrayUnion([friend.toMapLimitedData()]), }); await firebaseFirestore.collection("user").doc(friendToken).update({ "follower": isUserFollowing ? FieldValue.arrayRemove([self.toMapLimitedData()]) : FieldValue.arrayUnion([self.toMapLimitedData()]), }); }
- 如果你的应用有冷启动后快速触发操作的场景,可以在首页增加Firebase初始化状态监听,初始化完成前屏蔽相关功能按钮的点击,避免用户提前触发逻辑。
内容的提问来源于stack exchange,提问作者Dijon
相关产品推荐
相关产品推荐

