从Firebase Firestore拉取存储图文的集合数据时报错如何修复
修复方案
常见报错原因及对应修复
- API调用不兼容:新版FlutterFire中
FirebaseAuth.instance.currentUser是同步属性,不是异步方法,原代码加括号调用会直接抛出语法错误 - 缺少空安全校验:用户未登录、对应uid的profile文档不存在、文档字段为空时,直接取值会触发空异常
- 序列化逻辑漏洞:
UserModel.fromJson未处理字段缺失、类型不匹配的场景时,会抛出序列化异常
修复后可直接运行的代码
set isMyProfile(bool isMyProfile) {} @override void initState() { super.initState(); // 先校验登录状态 final currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) { print('用户未登录,无法拉取数据'); return; } print("got user"); FirebaseFirestore.instance .collection('profile') .doc(currentUser.uid) .get() .then((uservalue) { // 校验文档是否存在 if (!uservalue.exists) { print('对应用户的profile文档不存在'); return; } final docData = uservalue.data(); if (docData == null) { print('文档内容为空'); return; } final userModel = UserModel.fromJson(docData); // 空值兜底,避免后续操作空数组报错 savedImages = userModel.savedImagesPosts ?? []; savedText = userModel.savedTextPosts ?? []; setState(() {}); print("got list"); print(savedImages); }) // 捕获请求层异常,直接打印错误信息方便定位 .catchError((err) { print('拉取数据报错:$err'); }); }
其他需要排查的点
- 确认Firestore权限规则允许登录用户访问自身uid对应的profile文档,权限不足会返回403错误
- 核对
UserModel.fromJson中savedImagesPosts、savedTextPosts的字段名,和Firestore控制台文档内的字段名完全一致,大小写、拼写错误会导致取值为空 - 确认Model中定义的
savedImagesPosts、savedTextPosts类型和Firestore中存储的类型匹配,例如Firestore中存的是数组,Model中也要定义为List类型
内容的提问来源于stack exchange,提问作者ComaXD EA1
相关产品推荐
相关产品推荐

