Flutter开发时调用Firestore报未定义错误,如何正确使用FirebaseFirestore
报错根本原因
你下载的参考项目基于已停止维护的0.x版本cloud_firestore插件开发,该版本的全局类Firestore、配套方法在插件迭代到2.0及以上大版本时已被彻底移除,因此会触发“未定义标识符”的报错。你在官方文档中看到的FirebaseFirestore就是当前版本的核心操作类,你的判断是正确的。
API新旧版本对应替换规则
将原代码中的旧写法全部替换为新写法即可,核心映射关系为:
- 旧全局类
Firestore→ 新核心类FirebaseFirestore - 旧实例获取
Firestore.instance→ 新实例调用FirebaseFirestore.instance - 旧查询拉取方法
.getDocuments()→ 新拉取方法.get() - 旧查询结果文档列表属性
.documents→ 新属性.docs - 旧文档引用方法
.document('文档ID')→ 新文档引用方法.doc('文档ID') - 旧文档写入方法
.setData(数据)→ 新写入方法.set(数据) - 旧快照直接取字段的
快照['字段名']写法 → 新写法快照.data()['字段名']
修正后可直接运行的代码
handleSignIn() async { final res = await googleSignIn.signIn(); SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); final auth = await res.authentication; final credentials = GoogleAuthProvider.getCredential( idToken: auth.idToken, accessToken: auth.accessToken); final firebaseUser = (await firebaseAuth.signInWithCredential(credentials)).user; if (firebaseUser != null) { final result = (await FirebaseFirestore.instance .collection('users') .where('id', isEqualTo: firebaseUser.uid) .get()) .docs; if (result.length == 0) { /// 新用户 await FirebaseFirestore.instance .collection('users') .doc(firebaseUser.uid) .set({ "id": firebaseUser.uid, "name": firebaseUser.displayName ?? "", "profile_pic": firebaseUser.photoURL ?? "", "created_at": DateTime.now().millisecondsSinceEpoch, }); sharedPreferences.setString("id", firebaseUser.uid); sharedPreferences.setString("name", firebaseUser.displayName ?? ""); sharedPreferences.setString("profile_pic", firebaseUser.photoURL ?? ""); Navigator.of(context) .push(MaterialPageRoute(builder: (context) => Home())); } else { /// 老用户 final userData = result[0].data(); sharedPreferences.setString("id", userData["id"]); sharedPreferences.setString("name", userData["name"]); sharedPreferences.setString("profile_pic", userData["profile_pic"]); Navigator.of(context) .push(MaterialPageRoute(builder: (context) => Home())); } } }
配套校验注意事项
- 修改代码后,检查项目
pubspec.yaml中的cloud_firestore、firebase_auth依赖版本不低于2.0.0,建议拉取官方最新稳定版本,避免版本不匹配导致的其他API报错 - 确认应用启动时已完成Firebase初始化流程,未初始化直接调用Firebase服务会触发运行时错误
- 新版本Flutter默认开启空安全,涉及可空的用户信息(如displayName、photoURL)需要做非空兜底处理,避免静态检查报错
内容的提问来源于stack exchange,提问作者Kavinda Lochana
相关产品推荐
相关产品推荐

