Flutter升级依赖后出现Bad state: DocumentSnapshotPlatform无对应字段错误如何解决
问题修复方案
报错原因
你遇到的Bad state: field does not exist within the DocumentSnapshotPlatform报错,是cloud_firestore依赖升级到2.0+版本后,DocumentSnapshot的API出现不兼容变更导致的,旧版直接通过文档快照['字段名']读取字段的写法,和新版先调用.data()转成Map再读字段的写法被你混用,逻辑完全错误。
错误代码定位
你在SearchPage的build方法中传递drawer参数时,写了如下错误逻辑:
docsSnap!['profileImage'].data()['profileImage']
只有DocumentSnapshot对象才有.data()方法,你先通过docsSnap!['profileImage']读取到了字段值,再对这个字段值调用.data(),自然会触发报错。
修复代码
将build方法中drawer的参数部分替换为以下代码即可:
drawer: docsSnap != null ? (){ // 先把快照转换为Map格式的文档数据 Map<String, dynamic> userData = docsSnap!.data() as Map<String, dynamic>; return drawer( image1, context, userData['profileImage'], "${userData['firstName']} ${userData['lastName']}", userData['email'], "true", '/User/'+docRef! ); }() : drawer(image1,context,'assets/icons/avatar.png','Login / Register ','','false',null),
额外优化建议
- 读取字段前建议添加判空处理,比如
userData['profileImage'] ?? 'assets/icons/avatar.png',避免Firestore中对应字段缺失时触发空异常 - 删除drawer函数内部第一行的
String logStatus = LocalStorage.sharedInstance.loadAuthStatus(Constants.isLoggedIn).toString();代码,内部二次读取本地状态可能和外部传入的登录状态不一致,直接使用外部传入的logStatus参数即可 - 获取Firestore文档时增加文档存在判断和异常捕获,避免网络异常或文档不存在时触发崩溃:
FirebaseFirestore.instance.doc('/User/'+docRef!).get().then((DocumentSnapshot docs) { if(docs.exists){ print("Doc found"); setState(() { docsSnap = docs; }); }else{ setState((){docsSnap=null;}); print("Doc Not Exist"); } }).catchError((e){ print("获取用户文档失败:$e"); setState((){docsSnap=null;}); });
内容的提问来源于stack exchange,提问作者wilt donelly
相关产品推荐
相关产品推荐

